1单例-设计模式.pdf
上传人:qw****27 上传时间:2024-09-11 格式:PDF 页数:5 大小:354KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

1单例-设计模式.pdf

1单例-设计模式.pdf

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

(一)意图保证一个类仅有一个实例,并提供一个访问它的全局访问点。(二)动机对一些类来说,只有一个实例是很重要的。虽然系统中可以有许多打印机,但却只应该有一个打印假脱机(printerspooler),只应该有一个文件系统和一个窗口管理器。一个数字滤波器只能有一个A/D转换器。一个会计系统只能专用于一个公司。我们怎么样才能保证一个类只有一个实例并且这个实例易于被访问呢?一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象。一个更好的办法是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。这就是Singleton模式。(三)适用性在下面的情况下可以使用Singleton模式•当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。•当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。(四)结构(类图)(五)参与者•SingletonØ定义一个getInstance操作,允许客户访问它的唯一实例。getInstance是一个类操作(即JAVA中的一个静态成员函数)。Ø可能负责创建它自己的唯一实例。(六)协作•客户只能通过Singleton的getInstance操作访问一个Singleton的实例。(七)效果Singleton模式有许多优点:1)对唯一实例的受控访问因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它。2)缩小名空间Singleton模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染名空间。3)允许对操作和表示的精化Singleton类可以有子类,而且用这个扩展类的实例来配置一个应用是很容易的。你可以用你所需要的类的实例在运行时刻配置应用。4)允许可变数目的实例这个模式使得你易于改变你的想法,并允许Singleton类的多个实例。此外,你可以用相同的方法来控制应用所使用的实例的数目。只有允许访问Singleton实例的操作需要改变。5)比类操作更灵活另一种封装单件功能的方式是使用类操作(即JAVA中的静态成员函数)。(八)JAVA实现第一种(懒汉,线程不安全):Java代码1.publicclassSingleton{2.privatestaticSingletoninstance;3.privateSingleton(){}4.5.publicstaticSingletongetInstance(){6.if(instance==null){7.instance=newSingleton();8.}9.returninstance;10.}11.}这种写法lazyloading很明显,但是致命的是在多线程不能正常工作。第二种(懒汉,线程安全):Java代码1.publicclassSingleton{2.privatestaticSingletoninstance;3.privateSingleton(){}4.publicstaticsynchronizedSingletongetInstance(){5.if(instance==null){6.instance=newSingleton();7.}8.returninstance;9.}10.}这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazyloading,但是,遗憾的是,效率很低,99%情况下不需要同步。第三种(饿汉):Java代码1.publicclassSingleton{2.privatestaticSingletoninstance=newSingleton();3.privateSingleton(){}4.publicstaticSingletongetInstance(){5.returninstance;6.}7.}这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法,但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到lazyloading的效果。第四种(饿汉,变种):Java代码1.publicclassSingleton{2.privatestaticSingletoninstance=null;3.static{4.instance=newSingleton();5.}6.pr