设计模式——单例模式(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)、静态内部类等方式来实现单例模式。这些方式在某些场景下可能更加简洁、高效。

相关推荐
桦说编程1 分钟前
提示词工程的艺术
设计模式·agent·ai编程
Anurmy14 分钟前
设计模式之工厂方法
设计模式
Anurmy1 小时前
设计模式之适配器模式
设计模式·适配器模式
逆境不可逃2 小时前
【从零入门23种设计模式12】结构型之代理模式(Spring AOP + 自定义注解 + 切面的实战)
设计模式·代理模式
电子科技圈2 小时前
IAR扩展嵌入式开发平台,推出面向安全关键型应用的长期支持(LTS)服务
嵌入式硬件·安全·设计模式·软件工程·代码规范·设计规范·代码复审
像少年啦飞驰点、2 小时前
Java策略模式从入门到实战:小白也能看懂的设计模式指南
java·设计模式·策略模式·编程入门·小白教程
程序员Terry2 小时前
别再用 if-else 堆砌代码了!策略模式让你的代码优雅十倍
java·设计模式
JTCC3 小时前
Java 设计模式西游篇 - 第八回:适配器模式通万国 女儿国语言无障碍
python·设计模式·适配器模式
逆境不可逃3 小时前
【从零入门23种设计模式17】行为型之中介者模式
java·leetcode·microsoft·设计模式·职场和发展·中介者模式
Anurmy3 小时前
设计模式之抽象工厂
设计模式