Singleton设计模式

Singleton设计模式

ID:40299795

大小:39.00 KB

页数:6页

时间:2019-07-30

Singleton设计模式_第1页
Singleton设计模式_第2页
Singleton设计模式_第3页
Singleton设计模式_第4页
Singleton设计模式_第5页
资源描述:

《Singleton设计模式》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了,这可能也是面试中问得最多的一个设计模式了。这个设计模式主要目的是想在整个系统中只能出现一个类的实例。这样做当然是有必然的,比如你的软件的全局配置信息,或者是一个Factory,或是一个主控类,等等。你希望这个类在整个系统中只能出现一个实例。当然,作为一个技术负责人的你,你当然有权利通过使用非技术的手段来达到你的目的。比如:你在团队内部明文规定,“XX类只能有一个全局实例,如果某人使用两次以上,那么该人将被处于2000元的

2、罚款!”(呵呵),你当然有权这么做。但是如果你的设计的是东西是一个类库,或是一个需要提供给用户使用的API,恐怕你的这项规定将会失效。因为,你无权要求别人会那么做。所以,这就是为什么,我们希望通过使用技术的手段来达成这样一个目的的原因。   本文会带着你深入整个Singleton的世界,当然,我会放弃使用C++语言而改用Java语言,因为使用Java这个语言可能更容易让我说明一些事情。   Singleton的教学版本   这里,我将直接给出一个Singleton的简单实现,因为我相信你已经有这

3、方面的一些基础了。我们姑且把这具版本叫做1.0版 //version1.0publicclassSingleton{privatestaticfinalSingletonsingleton=null;privateSingleton(){}publicstaticSingletongetInstance(){if(singleton==null){singleton=newSingleton();}returnsingleton;}}   在上面的实例中,我想说明下面几个Singleton的特点

4、:(下面这些东西可能是尽人皆知的,没有什么新鲜的)   私有(private)的构造函数,表明这个类是不可能形成实例了。这主要是怕这个类会有多个实例。   即然这个类是不可能形成实例,那么,我们需要一个静态的方式让其形成实例:getInstance()。注意这个方法是在new自己,因为其可以访问私有的构造函数,所以他是可以保证实例被创建出来的。   在getInstance()中,先做判断是否已形成实例,如果已形成则直接返回,否则创建实例。   所形成的实例保存在自己类中的私有成员中。   我们

5、取实例时,只需要使用Singleton.getInstance()就行了。   当然,如果你觉得知道了上面这些事情后就学成了,那我给你当头棒喝一下了,事情远远没有那么简单。   Singleton的实际版本   上面的这个程序存在比较严重的问题,因为是全局性的实例,所以,在多线程情况下,所有的全局共享的东西都会变得非常的危险,这个也一样,在多线程情况下,如果多个线程同时调用getInstance()的话,那么,可能会有多个进程同时通过(singleton==null)的条件检查,于是,多个实例就

6、创建出来,并且很可能造成内存泄露问题。嗯,熟悉多线程的你一定会说——“我们需要线程互斥或同步”,没错,我们需要这个事情,于是我们的Singleton升级成1.1版,如下所示: //version1.1publicclassSingleton{privatestaticfinalSingletonsingleton=null;privateSingleton(){}publicstaticSingletongetInstance(){if(singleton==null){synchronized

7、(Singleton.class){singleton=newSingleton();}}returnsingleton;}}   嗯,使用了Java的synchronized方法,看起来不错哦。应该没有问题了吧?!错!这还是有问题!为什么呢?前面已经说过,如果有多个线程同时通过(singleton==null)的条件检查(因为他们并行运行),虽然我们的synchronized方法会帮助我们同步所有的线程,让我们并行线程变成串行的一个一个去new,那不还是一样的吗?同样会出现很多实例。嗯,确实如

8、此!看来,还得把那个判断(singleton==null)条件也同步起来。于是,我们的Singleton再次升级成1.2版本,如下所示: //version1.2publicclassSingleton{privatestaticfinalSingletonsingleton=null;privateSingleton(){}publicstaticSingletongetInstance(){synchronized(Singleton.class){if(singleton==null){s

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

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

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