意图:希望对象只有一个实例,但没有控制对象实现代的全局对象。还希望确保所有实体使用该对象相同的实例,而无需将引用传给它们。
问题:几个不同的客户对象需要引用同一个对象,而且希望确保这种类型的对象数目不超过一个。
解决方案:保证一个实例。
参与者与协作者:Client对象只能通过getInstance方法创建Singleton实例。
效果:Client对象无需操心是否存在Singleton实例。这是由Singleton自己控制的。
实现:
1. 添加一个类的私有的静态成员变量,引用所需的对象(初值为null)。
2. 添加一个公共静态方法,它在成员变量为null时实例化这个类(并设置成员变量的值),然后返回该成员变量的值。
3. 将构造函数的状态设置为保护或私有,从而防止任何人直接实例化这个类,绕过静态构造函数机制。
结构图:
Singleton仅适合于单线程,对于多线程则使用Singleton的变体——Double-Checked Locking模式。
Double-Checked Locking的特点:
1. 在创建对象之前,添加一次检查,避免不必要的锁定。
2. 支持多线程环境。
Double-Checked Locking实例:
private static DCClass instance; public static DCClass getInstance() { if (instance == null) { synchronized(this) { if (instance == null) instance = new DCClass(); } } return instance; }
实例上,Java由于编译器本身的优化工作,建议使用类装载程序来创建实例:
private static class Instance { // 内部私类 static final DCClass instance = new DCClass(); } public static DCClass getInstance() { return Instance.instance; }
相关日志
Tags: 设计模式