在软件工程中,单例模式是一种软件设计模式,它将类的实例化限制为一个“单个”实例。当恰好需要一个对象来协调整个系统中的动作时,这很有用。
通常,这是通过以下方式完成的:
- 声明该类的所有构造函数为私有
- 和提供一个静态方法,该方法返回对该实例的引用
饿汉式:该实例通常存储为私有静态变量。在初始化变量时,即在首次调用静态方法之前的某个时刻,创建了实例。以下是用Java编写的示例实现。
public final class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } }
懒汉式:单例实现可以使用延迟初始化,在首次调用静态方法时创建实例。如果可能同时从多个线程调用静态方法,则可能需要采取措施来防止可能导致创建该类的多个实例的竞争条件。以下是使用Java编写的使用带双重检查锁定的延迟初始化的线程安全示例实现。
public final 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; } }
总结:
- 单例模式通过私有构造函数并提供一个静态方法返回该实例
- 单例模式分为懒汉式和饿汉式
- 饿汉式在Class加载的时候就创建了该实例,不会出现线程安全的问题
- 懒汉式是在程序调用的时候创建实例,会出现线程安全的问题