《设计模式解析》摘录(14)

来源:互联网 发布:淘宝没展现怎么办 编辑:程序博客网 时间:2024/04/30 09:44

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 模式的具体实现(无状态时)也可以这样实例化。