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