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

作为对象的创建模式[GOF95], 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

注:本文乃阎宏博士的《Java与模式》一书的第十五章。

引言

单例模式的要点

单例单例

显然单例模式的要点有三个;一是某各类只能有一个实例;二是它必须自行创建这个事例;三是它必须自行向整个系统提供这个实例。在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙" 和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。

资源管理

一些资源管理器常常设计成单例模式。

在计算机系统中,需要管理的资源包括软件外部资源,譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler, 以避免两个打印作业同时输出到打印机中。每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。

需要管理的资源包括软件内部资源,譬如,大多数的软件都有一个(甚至多个)属性(properties)文件存放系统配置。这样的系统应当由一个对象来管理一个属性文件。

需要管理的软件内部资源也包括譬如负责记录网站来访人数的部件,记录软件系统内部事件、出错信息的部件,或是对系统的表现进行检查的部件等。这些部件都必须集中管理,不可政出多头。

这些资源管理器构件必须只有一个实例,这是其一;它们必须自行初始化,这是其二;允许整个系统访问自己这是其三。因此,它们都满足单例模式的条件,是单例模式的应用。

一个例子:Windows 回收站

Windows 9x 以后的视窗系统中都有一个回收站,下图就显示了Windows 2000 的回收站。

在整个视窗系统中,回收站只能有一个实例,整个系统都使用这个惟一的实例,而且回收站自行提供自己的实例。因此,回收站是单例模式的应用。

时间: 2024-12-02 03:25:38

Java模式设计之单例模式(一)的相关文章

Java模式设计之单例模式

在Java程序设计中经常会用到单例模式,但是很多时候程序员却不知道什么时候该使用单例模式,或者怎么使用单例模式. 我们总结分析单例模式的时候,了解到单例模式的要点有三个:一是某个类只能有一个实例:二是它必须自行创建这个事例:三是它必须自行向整个系统提供这个实例.在下面的对象图中,有一个"单例对象",而"客户甲"."客户乙"和"客户丙"是单例对象的三个客户对象.可以看到,所有的客户对象共享一个单例对象.而且从单例对象到自身的连接

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

不完全的单例类 什么是不完全的单例类 估计有些读者见过下面这样的"不完全"的单例类. 代码清单10:"不完全"单例类 package com.javapatterns.singleton.demos; public class LazySingleton { private static LazySingleton m_instance = null; /** * 公开的构造子,外界可以直接实例化 */ public LazySingleton() { } /**

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

在什么情况下使用单例模式 使用单例模式的条件 使用单例模式有一个很重要的必要条件: 在一个系统要求一个类只有一个实例时才应当使用单例模式.反过来说,如果一个类可以有几个实例共存,那么就没有必要使用单例类.但是有经验的读者可能会看到很多不当地使用单例模式的例子,可见做到上面这一点并不容易,下面就是一些这样的情况. 例子一 问:我的一个系统需要一些"全程"变量.学习了单例模式后,我发现可以使用一个单例类盛放所有的"全程"变量.请问这样做对吗? 答:这样做是违背单例模式的

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

一个实用的例子:属性管理器 什么是属性文件 这里给出一个读取属性(properties) 文件的单例类,作为单例模式的一个实用的例子.属性文件如同老式的视窗编程时的.ini 文件,用于存放系统的配置信息.配置信息在属性文件中以属性的方式存放,一个属性就是两个字符串组成的对子,其中一个字符串是键(key),另一个字符串是这个键的值(value). 大多数的系统都有一些配置常量,这些常量如果是存储在程序内部的,那么每一次修改这些常量都需要重新编译程序.将这些常量放在配置文件中,系统通过访问这个配置文

Java模式设计之多态模式与多语言支持

作为对象的创建模式,多态模式中的多态类可有多个实例:而且多态类必须自己创建.管理自己的实例,并向外界提供自己的实例.读者在阅读本文的时候,可以参考阅读笔者的<Java与模式>一书(刚由电子工业出版社出版)中的相关章节. 引言 一个真实的项目 这是一个真实的.面向全球消费者的华尔街金融网站项目的一部份.按照项目计划书,这个网站系统是要由数据库驱动的,并且要支持十九种不同的语言:而且在将来支持更多的语言.消费者在登录到系统上时可以选择自己所需要的语言,系统则根据用户的选择将网站的静态文字和动态文字

Java模式设计之数据访问对象模式

很多的J2EE应用程序需要使用持久性数据(数据库.文件等).不同的程序,持久性存储是各不相同的,并且用来访问这些不同的持久性存储机制的API也有很大的不同.如果应用程序要在不同的持久性存储间迁移,这些访问特定持久存储层的代码将面临重写. 如何解决这个问题?且看"DAO模式" 数据访问对象(Data Acess Object) 模式 一.环境 根据数据源不同,数据访问也不同.根据存储的类型(关系数据库.面向对象数据库.文件等等)和供应商实现不同,持久性存储(比如数据库)的访问差别也很大.

JAVA:将反射技术应用于工厂模式(Factory)和单例模式(Singleton)的简单代码

反射技术大量用于Java设计模式和框架技术,最常见的设计模式就是工厂模式(Factory)和单例模式(Singleton). 参考URL: http://blog.csdn.net/xiaohai798/article/details/11640427 用接口来沟通不同程序的开发进度,不必等上游程序写好代码之后,再注入后面流程的程序员.且在实现上,可以用配置文件灵活变更,而不用重编译整个项目. InterfaceTest.java: interface InterfaceTest { //基于接

学习笔记之JAVA图形设计卷I AWT——第3章 图 形

   学习笔记之JAVA图形设计卷I AWT--第3章 图 形 前时显示器坏了,file://写前言:我觉得写的不是学习笔记,倒象教程.我是想让有所获,故详细了点.注意1:在AWT中提供的用户接口构件(如按钮.列表.菜单.对话框等)不包含一些类似的纯粹的绘制图形的对象(如Line或Circle类) 详细意思:由于原始的AWT在设计时不允许纯粹的绘制图形的对象,那么Rectangle.Polygon和Point没有任何绘制图形的能力.换句话说,Rectangle.Polygon和Point不具备d

基础-JAVA课程设计实数计算器求指导思路

问题描述 JAVA课程设计实数计算器求指导思路 [问题描述]运用面向对象程序设计知识,利用Java语言设计和实现一个复数计算器.要求具备如下主要功能: (1)建立实数类.复数类 (2)实现实数.复数信息的初始化 (3)实现实数的加.减.乘.除.自增.自减.求平方.二次方根等操作 (4)实现复数的加.减.乘.除.取模.求平方.求共轭复数.求单个复数的向量角.求两个复数的夹角等运算 (5)实现实数.复数信息的输出 在实现过程中,需利用面向对象程序设计理论的基础知识,充分体现出Java语言关于类.继承