深入浅出单例模式

深入浅出单例模式

ID:34252214

大小:46.00 KB

页数:5页

时间:2019-03-04

深入浅出单例模式_第1页
深入浅出单例模式_第2页
深入浅出单例模式_第3页
深入浅出单例模式_第4页
深入浅出单例模式_第5页
资源描述:

《深入浅出单例模式》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、深入浅出单例模式一、引子单例模式是设计模式中使用很频繁的一种模式,在各种开源框架、应用系统中多有应用,在我前面的几篇文章中也结合其它模式使用到了单例模式。这里我们就单例模式进行系统的学习。并对有人提出的“单例模式是邪恶的”这个观点进行了一定的分析。二、定义与结构单例模式又叫做单态模式或者单件模式。在GOF书中给出的定义为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式中的“单例”通常用来代表那些本质上具有唯一性的系统组件(或者叫做资源)。比如文件系统、资源管理器等等。单例模式的目的就是要控制特定的类只产生一个对象,当然也允许在

2、一定情况下灵活的改变对象的个数。那么怎么来实现单例模式呢?一个类的对象的产生是由类构造函数来完成的,如果想限制对象的产生,就要将构造函数变为私有的(至少是受保护的),使得外面的类不能通过引用来产生对象;同时为了保证类的可用性,就必须提供一个自己的对象以及访问这个对象的静态方法。现在对单例模式有了大概的了解了吧,其实单例模式在实现上是非常简单的——只有一个角色,而客户则通过调用类方法来得到类的对象。放上一个类图吧,这样更直观一些:单例模式可分为有状态的和无状态的。有状态的单例对象一般也是可变的单例对象,多个单态对象在一起就可以作为一个状态仓库一

3、样向外提供服务。没有状态的单例对象也就是不变单例对象,仅用做提供工具函数。三、实现在单例模式的实现上有几种不同的方式,我在这里将一一讲解。先来看一种方式,它在《java与模式》中被称为饿汉式。publicclassSingleton{//在自己内部定义自己一个实例//注意这是private只供内部调用privatestaticSingletoninstance=newSingleton();//如上面所述,将构造函数设置为私有privateSingleton(){} //静态工厂方法,提供了一个供外部访问得到对象的静态方法    public

4、staticSingletongetInstance(){    returninstance;    }}       下面这种方式被称为懒汉式:PpublicclassSingleton{       //和上面有什么不同?privatestaticSingletoninstance=null;//设置为私有的构造函数privateSingleton(){} //静态工厂方法publicstaticsynchronizedSingletongetInstance(){//这个方法比上面有所改进         if(instance==n

5、ull)              instance=newSingleton();         returninstance;  }}先让我们来比较一下这两种实现方式。首先他们的构造函数都是私有的,彻底断开了使用构造函数来得到类的实例的通道,但是这样也使得类失去了多态性(大概这就是为什么有人将这种模式称作单态模式)。  在第二种方式中,对静态工厂方法进行了同步处理,原因很明显——为了防止多线程环境中产生多个实例;而在第一种方式中则不存在这种情况。       在第二种方式中将类对自己的实例化延迟到第一次被引用的时候。而在第一种方式中则是

6、在类被加载的时候实例化,这样多次加载会照成多次实例化。但是第二种方式由于使用了同步处理,在反应速度上要比第一种慢一些。       在《java与模式》书中提到,就java语言来说,第一种方式更符合java语言本身的特点。       以上两种实现方式均失去了多态性,不允许被继承。还有另外一种灵活点的实现,将构造函数设置为受保护的,这样允许被继承产生子类。这种方式在具体实现上又有所不同,可以将父类中获得对象的静态方法放到子类中再实现;也可以在父类的静态方法中进行条件判断来决定获得哪一个对象;在GOF中认为最好的一种方式是维护一张存有对象和对应

7、名称的注册表(可以使用HashMap来实现)。下面的实现参考《java与模式》采用带有注册表的方式。importjava.util.HashMap;publicclassSingleton{//用来存放对应关系       privatestaticHashMapsinRegistry=newHashMap();       staticprivateSingletons=newSingleton();       //受保护的构造函数       protectedSingleton()       {}       publicstati

8、cSingletongetInstance(Stringname)       {              if(name==null)             

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。