- 1、本文档被系统程序自动判定探测到侵权嫌疑,本站暂时做下架处理。
- 2、如果您确认为侵权,可联系本站左侧在线QQ客服请求删除。我们会保证在24小时内做出处理,应急电话:400-050-0827。
- 3、此文档由网友上传,因疑似侵权的原因,本站不提供该文档下载,只提供部分内容试读。如果您是出版社/作者,看到后可认领文档,您也可以联系本站进行批量认领。
查看更多
《Java 与模式》作者阎宏博士 电子工业出版社出版
第15 章 单例(Singleton)模式
作为对象的创建模式[GOF95],单例模式确保某一个类只有一个实例,而且自行实例
化并向整个系统提供这个实例。这个类称为单例类。
15.1 引 言
单例模式的要点
单例单例
显然单例模式的要点有三个;一是某各类只能有一个实例;二是它必须自行创建这个
事例;三是它必须自行向整个系统提供这个实例。在下面的对象图中,有一个“单例对象”,
而“客户甲”、“客户乙”和“客户丙”是单例对象的三个客户对象。可以看到,所有的客
户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自
己的引用。
资源管理
一些资源管理器常常设计成单例模式。
在计算机系统中,需要管理的资源包括软件外部资源,譬如每台计算机可以有若干个
打印机,但只能有一个Printer Spooler ,以避免两个打印作业同时输出到打印机中。每台计
算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作
业同时传到传真卡中的情况。每台计算机可以有若干通信端口,系统应当集中管理这些通
信端口,以避免一个通信端口同时被两个请求同时调用。
需要管理的资源包括软件内部资源,譬如,大多数的软件都有一个(甚至多个)属性
(properties )文件存放系统配置。这样的系统应当由一个对象来管理一个属性文件。
·222 · Java 与模式
需要管理的软件内部资源也包括譬如负责记录网站来访人数的部件,记录软件系统内
部事件、出错信息的部件,或是对系统的表现进行检查的部件等。这些部件都必须集中管
理,不可政出多头。
这些资源管理器构件必须只有一个实例,这是其一;它们必须自行初始化,这是其二;
允许整个系统访问自己这是其三。因此,它们都满足单例模式的条件,是单例模式的应用。
一个例子:Windows 回收站
Windows 9x 以后的视窗系统中都有一个回收站,下图就显示了Windows 2000 的回收
站。
在整个视窗系统中,回收站只能有一个实例,整个系统都使用这个惟一的实例,而且
回收站自行提供自己的实例。因此,回收站是单例模式的应用。
双重检查成例
在本章最后的附录里研究了双重检查成例。双重检查成例与单例模式并无直接的关系,
但是由于很多 C 语言设计师在单例模式里面使用双重检查成例,所以这一做法也被很多
Java 设计师所模仿。因此,本书在附录里提醒读者,双重检查成例在Java 语言里并不能成
立,详情请见本章的附录。
15.2 单例模式的结构
单例模式有以下的特点:
单例类只可有一个实例。
单例类必须自己创建自己这惟一的实例。
单例类必须给所有其他对象提供这一实例。
虽然单例模式中的单例类被限定只能有一个实例,但是单例模式和单例类可以很容易
被推广到任意且有限多个实例的情况,这时候称它为多例模式(Multiton Pattern )和多例类
(Multiton Class ),请见“专题:多例(Multiton )模式与多语言支持”一章。单例类的简
第15 章 单例(Singleton )模式 ·223 ·
略类图如下所示。
由于Java 语言的特点,使得单例模式在Java 语言的实现上有自己的特点。这些特点主
要表现在单例类如何将自己实例化上。
饿汉式单例类
饿汉式单例类是在Java 语言里实现得最为简便的单例类,下面所示的类图描述了一个
饿汉式单例类的典型实现。
从图中可以看出,此类已经自已将自己实例化。
代码清单 1:饿汉式单例类
public class EagerSingleton
{
private static final EagerSingleton m_instance =
new EagerSingleton();
/**
* 私有的默认构造子
文档评论(0)