单例模式

120 阅读2分钟

摘要

单例模式是一种设计模式,它保证了一个类只有一个实例,并提供了一个全局访问点。

架构图

image.png

为什么要使用单例模式?

有些情况下,我们需要确保一个类只有一个实例,例如:

  • 数据库连接池:如果每次访问数据库都创建一个新的连接,会导致资源浪费和性能下降。如果使用一个共享的连接池,可以提高效率和稳定性。
  • 日志记录器:如果每次记录日志都创建一个新的文件,会导致文件过多和管理困难。如果使用一个共享的日志记录器,可以方便地统一管理和查看日志。
  • 配置管理器:如果每次读取配置都从文件或数据库中加载,会导致性能下降和数据不一致。如果使用一个共享的配置管理器,可以缓存配置信息并保持同步。

如何使用单例模式?

单例模式的实现方式有多种,但是它们都遵循以下几个原则:

  • 将构造函数私有化,防止外部创建新的实例。
  • 提供一个静态方法或属性,用于获取唯一的实例。
  • 在内部维护一个静态变量,用于存储唯一的实例。
  • 在需要时才创建唯一的实例,避免提前初始化。

单例模式的优缺点

单例模式的优点有:

  • 节省资源和内存,提高性能和效率。
  • 保证数据的一致性和安全性,避免出现冲突和错误。
  • 简化代码和逻辑,易于理解和维护。

单例模式的缺点有:

  • 违反了单一职责原则,一个类既负责创建自己的实例,又负责业务逻辑。
  • 增加了代码的耦合度,难以进行测试和扩展。
  • 可能存在线程安全问题,需要考虑同步机制。

代码示例

// 饿汉式单例模式  
public class Singleton {  
    // 在类加载时就创建一个唯一的实例  
    private static final Singleton instance = new Singleton();  

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

    // 提供一个公共的静态方法获取实例  
    public static Singleton getInstance() {  
        return instance;  
    }  
}  
  
// 懒汉式单例模式  
public class Singleton {  
    // 声明一个静态的私有变量,但不初始化  
    private static Singleton instance;  

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

    // 提供一个公共的静态方法获取实例,并在第一次调用时初始化实例  
    public static synchronized Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}

参考资料

Singleton (refactoring.guru)