Java超详细讲解设计模式之一的单例模式

Java超详细讲解设计模式之单例模式

1. 什么是单例模式?

单例模式是一种常用的设计模式,简单来说就是保证一个类只有一个实例,并且提供一个全局访问点。

它能够避免因为对象过多而导致系统性能下降的问题,实现对象的复用,以及编译器对一些变量、对象和方法进行统一管理的好处。

常见应用场景有以下几个方面:

  • 一个对象需要在系统中被重复使用
  • 一个共享资源(如数据库等)需要被多个不同的部件频繁访问
  • 当操作系统中唯一的资源(如守护进程、计时器、文件I / O等)需要被多次访问时

2. 实现单例模式的几种方式

  • 饿汉式单例模式:在类加载时就完成了初始化,所以类加载较慢、但获取对象的速度极快。

  • 懒汉式单例模式(懒加载):只有当第一次创建对象时才会进行初始化,具有延迟加载的优势,但需要考虑并发的问题。

  • 枚举单例模式:不仅可以解决线程同步的问题,还可以防止反序列化重新创建对象,但是不太常用。

  • 静态内部类单例模式:由于是静态内部类,所以只有在使用时才会加载、具有了懒加载的效果,同时通过静态域来实现,线程同步也得以考虑,是目前最优的实现方式。

3. 示例说明

3.1 饿汉式单例模式

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton(){
        //私有构造方法
    }

    public static Singleton getInstance(){
        return instance;
    }
}

3.2 懒汉式单例模式

public class Singleton {
    private static volatile Singleton instance = null;

    private Singleton(){
        //私有构造方法
    }

    public static synchronized Singleton getInstance(){
        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}

推荐使用双重校验锁的方式来实现懒汉式单例模式:

public class Singleton {
    private static volatile Singleton instance = null;

    private Singleton(){
        //私有构造方法
    }

    public static Singleton getInstance(){
        if(instance == null){
            synchronized (Singleton.class){
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

3.3 枚举单例模式

public enum Singleton {
    INSTANCE;

    public void method(){
        //方法体
    }
}

3.4 静态内部类单例模式

public class Singleton {
    private Singleton (){
        //私有构造方法
    }

    private static class SingletonInstance{
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance(){
        return SingletonInstance.INSTANCE;
    }
}

4. 总结

在实际的开发中,单例模式是非常常见的一种设计模式,通过实现单例模式,可以保证整个系统更高效,用最少的资源和时间来完成需求。当然在使用的过程中要注意线程安全和反射创建对象的问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java超详细讲解设计模式之一的单例模式 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • ManyToMany单向、双向:@JoinTable的使用

    ManyToMany 单向使用 @JoinTable 的完整攻略 ManyToMany 单向关系适用于两个实体之间是互相独立的,例如学生可以选择多个课程,而课程也可以被多个学生选择。我们可以使用 @ManyToMany 注解来映射这样的关系。当两个实体之间是互相依赖的,例如 Order 和 Product,我们就需要使用双向 ManyToMany,可以参考第…

    Java 2023年5月20日
    00
  • MySQL基于java实现备份表操作

    MySQL基于Java实现备份表操作的攻略主要分为以下几个步骤: 引入相关依赖 首先,我们需要在项目中引入mysql-connector-java这个库的依赖。在Maven项目中,可以在pom.xml文件中添加如下依赖: <dependency> <groupId>mysql</groupId> <artifactI…

    Java 2023年5月20日
    00
  • Spring Boot使用Schedule实现定时任务的方法

    下面是详细的“Spring Boot使用Schedule实现定时任务的方法”的攻略: 一、概述 在Spring Boot中,我们可以使用Spring Scheduler实现简单的定时任务。Spring Scheduler是Spring框架中的一个轻量级、基于内存的定时任务框架,可以方便地实现定时任务。在本文中,我们将详细介绍如何在Spring Boot中使用…

    Java 2023年5月20日
    00
  • MyBatis 执行动态 SQL语句详解

    MyBatis 执行动态 SQL语句详解 什么是动态 SQL语句 动态SQL语句是根据不同的输入条件,动态创建不同的SQL语句,以便能够灵活地满足不同的查询需求。 MyBatis如何执行动态 SQL语句 MyBatis执行动态SQL语句的方式是通过将动态SQL语句解析成对应的静态SQL语句,然后再执行静态SQL语句。 这个过程MyBatis通过SqlNode…

    Java 2023年5月20日
    00
  • struts2实现多文件上传

    首先,要实现多文件上传,需要在前端使用表单,并且表单中需要添加一个 enctype=”multipart/form-data” 的属性,才能够让文件被正确解析和上传。同时,需要使用 type=”file” 的 <input> 标签来让用户选择文件。 在Struts2中,可以使用 org.apache.struts2.dispatcher.mult…

    Java 2023年5月20日
    00
  • Android Activity生命周期详解

    下面是关于“Android Activity生命周期详解”的完整攻略。 简介 很多初学者在学习 Android 开发时容易被 Activity 的生命周期所迷惑。但实际上,了解生命周期可以帮助我们更好地理解 Activity 的内部操作以及增强应用程序的用户体验。 Activity 的生命周期由一系列的阶段组成,从 Activity 的启动到关闭,包括一些生…

    Java 2023年6月15日
    00
  • Spring Security权限管理实现接口动态权限控制

    以下是关于Spring Security权限管理实现接口动态权限控制的完整攻略: 1. 什么是接口动态权限控制 接口动态权限控制即根据用户的权限动态的对接口进行权限控制,这个过程可以分为两步:一是获取用户所拥有的权限,二是根据用户所拥有的权限动态的对接口进行控制。 2. Spring Security实现接口动态权限控制的步骤 以下是实现Spring Sec…

    Java 2023年6月3日
    00
  • Spring security权限配置与使用大全

    Spring Security权限配置与使用大全 简介 Spring Security 是 Spring Framework 提供的安全验证框架,主要解决 Web 应用程序的安全管理问题。它通过认证和授权的方式控制用户对资源的访问权限,防止未授权的用户访问这些资源,保证Web应用程序的安全性。 Spring Security 模块的工作方式是基于过滤器链(F…

    Java 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部