定义

Ensure a class has only one instance, and provide a global point of access to it.

确保某一个类只有一个实例,而且自行实例化并向整个系统提供整个实例。

通用类图

单例模式

  • 单例模式类的构造方法是一个私有构造方法
  • 单例模式类的属性包含自身,并限制为private static final类型,默认调用自身的构造函数
  • 单例模式类提供staticgetSingleton()方法供外部引用

通用代码

public class Singleton(){
private static final Singleton singleton = new Singleton(); //私有静态属性
private Singleton(){} //私有构造方法
public static Singleton getSingleton(){} //引用者必须通过该方法获得实例对象
public static void doSomething(){} //类中的其他方法必须也要是static的
}

一个例子

GitHub源码-单例模式

单例模式的优点

  • 单例模式减少了内存开支和创建、销毁的开销
  • 单例模式永驻内存,减少了性能开销。比如Spring的bean。
  • 单例模式可以避免对资源的多重占用。比如写文件的操作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。
  • 单例模式可以在系统设置全局的访问点,优化和共享资源访问。

单例模式的缺点

  • 单例模式没有接口,扩展很困难,只能通过修改代码。
  • 单例模式没有完成时,没法测试。因为没有接口,所以没法mock。
  • 单例模式通常很难保证单一职责。

单例模式的使用场景

各种要求一个类只能有一个对象的场景。

  • 要求生成唯一序列号的环境。
  • 在整个项目中需要一个共享访问点或共享数据的时候。
  • 创建一个对象需要消耗的资源过多的时候,比如数据库连接。
  • 需要定义大量的静态常量和静态方法的环境。比如工具类。