Singleton 模式
Singleton 模式和 Double-Checked Locking 模式都可以用于确保某个类只有一个对象实例化。两个模式的区别在于:Singleton 模式用在单线程应用程序中,而 Double-Checked Locking 模式用于多线程应用程序。
关键特征:
意图:希望对象只有一个实例,但没有控制对象实例化的全局对象。还希望确保所有实例使用该对象相同的实例,而无需将引用传给它们。
问题:几个不同的客户对象需要引用同一个对象,而且希望确保这种类型的对象数目不超过一个。
解决方案:保证一个实例。
参与者与协作者:Client 对象只能通过 getInstance 方法创建 Singleton 实例。
效果:Client 对象无需操心是否已存在 Singleton 实例。这是由 Singleton 自己控制的。
实现:
1、添加一个类的私有的静态成员变量,引用所需的对象;
2、添加一个公有静态方法,它在成员变量的值为 null 时实例化这个类(并设置成员变量的值),然后返回该成员变量的值;
3、将构造函数的状态设置为保护或私有,从而防止任何人直接实例化这个类,绕过静态构造函数机制。
如果知道需要一个对象,而且没有性能因素需要将对象的实例化推迟到需要时进行,用静态成员变量包含对该对象的引用,往往更简单。
在多线程应用程序中,Singleton 对象通常必须是线程安全的,这意味着该对象要么在不同线程之间使用同步,要么没有数据成员。
有状态 Singleton 应该谨慎使用,因为这样的全局数据可能会使系统的不同部分耦合。
无状态 Facade 可以用一个 Singleton 实现化,以避免出现一个以上 Facade。Strategy 模式的具体策略对象(无状态时),Bridge 模式的具体实现(无状态时)也可以这样实例化。