快速业务通道

Java模式设计之单例模式(四) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22

Java模式设计之单例模式(四)

时间:2010-12-14

不完全的单例类

什么是不完全的单例类

估计有些读者见过下面这样的“不完全”的单例类。

代码清单10:“不完全”单例类

package com.javapatterns.singleton.demos; public class LazySingleton { private static LazySingleton m_instance = null; /** * 公开的构造子,外界可以直接实例化 */ public LazySingleton() { } /** * 静态工厂方法 * @return 返还LazySingleton 类的惟一实例 */ synchronized public static LazySingleton getInstance() { if (m_instance == null) { m_instance = new LazySingleton(); } return m_instance; } }

上面的代码乍看起来是一个“懒汉”式单例类,仔细一看,发现有一个公开的构造子。由于外界可以使用构造子创建出任意多个此类的实例,这违背了单例类只能有一个(或有限个)实例的特性,因此这个类不是完全的单例类。这种情况有时会出现,比如javax.swing.TimerQueue 便是一例,关于这个类,请参见《Java与模式》一书中的“观察者模式与Swing 定时器” 一章。

造成这种情况出现的原因有以下几种可能:

(1) 初学者的错误。许多初学者没有认识到单例类的构造子不能是公开的,因此犯下这个错误。有些初学Java 语言的学员甚至不知道一个Java 类的构造子可以不是公开的。在 这种情况下,设计师可能会通过自我约束,也就是说不去调用构造子的办法,将这个不完全的单例类在使用中作为一个单例类使用。

在这种情况下,一个简单的矫正办法,就是将公开的构造子改为私有的构造子。

(2) 当初出于考虑不周,将一个类设计成为单例类,后来发现此类应当有多于一个的实例。为了弥补错误, 干脆将构造子改为公开的,以便在需要多于一个的实例时, 可以随时调用构造子创建新的实例。要纠正这种情况较为困难,必须根据具体情况做出改进的决定。如果一个类在最初被设计成为单例类,但后来发现实际上此类应当有有限多个实例,这时候应当考虑是否将单例类改为多例类(Multiton)。

(3)设计师的Java 知识很好,而且也知道单例模式的正确使用方法,但是还是有意使用这种不完全的单例模式,因为他意在使用一种“改良”的单例模式。这时候, 除去共有的构造子不符合单例模式的要求之外,这个类必须是很好的单例模式。

Java模式设计之单例模式(四)(2)

时间:2010-12-14

默认实例模式

有些设计师将这种不完全的单例模式叫做“默认实例模式”(Default Instance Pattern)。在所谓的“ 默认实例模式”里面, 一个类提供静态的方法,如同单例模式一样, 同时又提供一个公开的构造子,如同普通的类一样。

这样做的惟一好处是,这种模式允许客户端选择如何将类实例化:创建新的自己独有的实例,或者使用共享的实例。这样一来,由于没有任何的强制性措施,客户端的选择不一定是合理的选择。其结果是设计师往往不会花费时间在如何提供最好的选择上,而是不恰当地将这种选择交给客户端的程序员,这样必然会导致不理想的设计和欠考虑的实现。

本文建议读者不要这样做。

相关模式

有一些模式可以使用单例模式,如抽象工厂模式可以使用单例模式,将具体工厂类设计成单例类;建造模式可以使用单例模式,将具体建造类设计成单例类。

多例(Multiton)模式

正如同本章所说的,单例模式的精神可以推广到多于一个实例的情况。这时候这种类叫做多例类,这种模式叫做多例模式。单例类(左)和多例类(右)的类图如下所示。

Java模式设计之单例模式(四) - 编程入门网

关于多例模式,请见《Java与模式》一书中的“专题:多例(Multiton)模式与多语言支持”一章。

简单工厂(Simple Factory)模式

单例

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号