【设计模式】单例模式的三种实现方式

简介: 【设计模式】单例模式的三种实现方式

什么是单例模式(Singleton)?

单例模式确保一个类只有一个实例,并提供一个全局访问点

这定义已经很明确了,那就是全局只能有这个类的一个实例,举世无双


这种模式使用的场景实在是太多了,它就好像对某个类实行了“计划生育”政策,限制住了某个类的数量。例如某些类对象需要经常使用,但是如果不停的构造-析构又会消耗不必要的资源;又比如某个资源或文件只能够有一个对象,那就可以通过该模式实现全局的获取。

如何实现

那么如何让全局只有一个类呢?

——需要限制类对象创建,可以将构造函数声明为private,这样就不能在外部通过new来实现了。并且利用static仅有一个全局对象的特点来限制实例个数。

问题来了,既然构造函数已经被声明为private,怎么获得该类的对象呢?

——简单,在该类的内部声明一个静态成员函数即可。可以通过这个静态成员函数来获取类内部的对象。

单例模式的实现分为懒汉、饿汉模式,主要是从是否在类初始化的时候的创建对象,如果是,那就是饿汉模式,一刻都等不及。

懒汉模式:直到需要该实例的时候才创建对应的实例,最简单的实现。

public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
  
  //需要的时候再创建对应的实例
    public static Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}

考虑到上面的代码线程不安全,可以通过加锁机制改为:

public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){}  
    //采用双检查锁,避免频繁加锁,性能较好
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
        }  
    }  
    return singleton;  
    }  
}

注意,这里使用了两次判断,如果只使用一次判断加锁的话,在单例模式的使用过程中就会有很多次加锁操作。而这些加锁操作是可以避免的,这种方式被称为double-check。

**饿汉模式:类初始化的时候就建立该类的一个实例,**通过静态变量来实现。

public class SingleObject {
 
   //创建 SingleObject 的一个对象
   private static SingleObject instance = new SingleObject();
 
   //让构造函数为 private,这样该类就不会被实例化
   private SingleObject(){}
 
   //可以通过该API获取唯一可用的对象
   public static SingleObject getInstance(){
      return instance;
   }
 
   public void showMessage(){
      System.out.println("Hello World!");
   }
}

总结

总之,单例模式的核心就是**保证类对象只有一个。**而具体的实现方式则是为了应对不同场景、性能要求而选择的。

参考资料

《大话设计模式》

相关文章
|
1月前
|
设计模式 安全 Java
【设计模式系列笔记】单例模式
单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点,以便全局范围内访问这个实例。单例模式的目标是限制一个类的实例化,确保在整个应用程序中只有一个实例存在,并提供对这个唯一实例的全局访问点。这对于控制对资源的访问、限制特定类的实例数量等场景非常有用。
131 5
|
1月前
|
设计模式 PHP
php设计模式--单例模式(三)
php设计模式--单例模式(三)
17 0
|
18天前
|
设计模式 SQL 安全
【设计模式】第二篇:单例模式的几种实现And反射对其的破坏
一个普通实例化,一个反射实例化 但是我们如果通过反射的方式进行实例化类,会有什么问题呢? public static void main(String[] args) throws Exception { Lazy1 lazy1 = getLazy1();
21 5
|
1月前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
3天前
|
设计模式 安全 Java
Java中的单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点
Java单例模式确保类仅有一个实例,并提供全局访问点。常见实现包括: - 饿汉式:静态初始化,线程安全。 - 懒汉式:延迟初始化,需同步保证线程安全。 - 双重检查锁定:优化懒汉式,减少同步开销。 - 静态内部类:延迟加载,线程安全。 - 枚举:简洁线程安全,不适用于复杂构造。 - 容器实现:如Spring框架,用于依赖注入。选择依据需求,如延迟加载、线程安全和扩展性。
33 10
|
2天前
|
设计模式 缓存 安全
Java设计模式的单例模式应用场景
Java设计模式的单例模式应用场景
16 8
|
3天前
|
设计模式 缓存 安全
java中的设计模式&单例模式
java中的设计模式&单例模式
|
6天前
|
设计模式 安全 Java
Java设计模式之单例模式详解
Java设计模式之单例模式详解
|
1天前
|
设计模式 Java
设计模式-单例模式(JAVA)
设计模式-单例模式(JAVA)
4 0
|
13天前
|
设计模式 消息中间件 SQL
设计模式面试题-单例模式【JavaPub版】
设计模式面试题-单例模式【JavaPub版】
13 0