设计模式——单例模式(Singleton)

单例模式(Singleton Pattern)是设计模式中的一种,它确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。这种模式在多种场景下都非常有用,比如配置文件的读取、数据库连接的创建、线程池的管理等。

实现单例模式的要点:

  1. 私有构造函数 :防止其他类通过new关键字创建实例。
  2. 私有静态实例:在类内部定义一个静态的实例变量来保存类的唯一实例。
  3. 公共的静态方法:提供一个公共的静态方法来获取该类的唯一实例。

示例代码(Java):

java 复制代码
public class Singleton {
    // 私有静态实例
    private static Singleton instance;

    // 私有构造函数
    private Singleton() {}

    // 公共的静态方法(也称为获取器或访问器)
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

注意 :上述示例中的getInstance方法使用了synchronized关键字,这是为了保证在多线程环境下的线程安全。但是,这种实现方式在性能上可能不是最优的,因为每次调用getInstance方法时都需要进行同步。

改进的单例模式(双重检查锁定/双检锁):

java 复制代码
public class Singleton {
    // 使用 volatile 关键字来确保 instance 在多线程中的可见性
    private volatile static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) { // 第一次检查
            synchronized (Singleton.class) {
                if (instance == null) { // 第二次检查
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

在改进的版本中,我们使用了双重检查锁定(Double-Checked Locking, DCL)来减少同步的开销。同时,我们使用了volatile关键字来确保instance变量在多线程环境下的可见性。这是因为instance = new Singleton();这行代码并不是一个原子操作,它包含了三个步骤:分配内存、初始化对象、将instance指向分配的内存地址。如果没有volatile关键字,编译器可能会进行指令重排序,导致其他线程看到instance不为null,但是对象还没有被完全初始化的情况。

其他实现方式:

除了上述两种常见的实现方式外,还有使用枚举(Enum)、静态内部类等方式来实现单例模式。这些方式在某些场景下可能更加简洁、高效。

相关推荐
liang89998 分钟前
设计模式之策略模式(Strategy)
设计模式·策略模式
马剑威(威哥爱编程)1 小时前
读写锁分离设计模式详解
java·设计模式·java-ee
修道-03231 小时前
【JAVA】二、设计模式之策略模式
java·设计模式·策略模式
G皮T4 小时前
【设计模式】结构型模式(四):组合模式、享元模式
java·设计模式·组合模式·享元模式·composite·flyweight
W_Meng_H4 小时前
设计模式-组合模式
设计模式·组合模式
无尽的大道10 小时前
单例模式详解:如何优雅地实现线程安全的单例
单例模式
吾与谁归in15 小时前
【C#设计模式(8)——过滤器模式(Adapter Pattern)】
设计模式·c#·过滤器模式
G皮T15 小时前
【设计模式】行为型模式(一):模板方法模式、观察者模式
java·观察者模式·设计模式·模板方法模式·template method·行为型模式·observer
iFlyCai18 小时前
23种设计模式的Flutter实现第一篇创建型模式(一)
flutter·设计模式·dart
zhouzhihao_0718 小时前
程序代码设计模式之模板方法模式(1)
java·设计模式·模板方法模式