设计模式学习——Singleton(单件)

意图:希望对象只有一个实例,但没有控制对象实现代的全局对象。还希望确保所有实体使用该对象相同的实例,而无需将引用传给它们。

问题:几个不同的客户对象需要引用同一个对象,而且希望确保这种类型的对象数目不超过一个。

解决方案:保证一个实例。

参与者与协作者: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:

Leave a Reply


提醒: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。请务必注意user必须和评论者名相匹配(大小写一致)。