`

滥用单例设计模式的害处

阅读更多

注:本文转载自CSDN. 作者:苏林

http://blog.csdn.net/Slin000/archive/2008/11/19/3333724.aspx

 

大多数做软件设计的人都学习过设计模式,而看过《设计模式》那本书的人一定对单例模式有印象。在众多 的设计模式中,单例模式显得很特别,清晰又简单,容易被人记住,所以使用的也相当多。然而最近在一个 C++ 的新项目中,发现了非常多的地方用了单例模式,几乎到了滥用的地步,带来的不好的地方也显现了出 来。本文总结一下单例模式的害处,与大家分享,也提醒一些初学设计模式的朋友:设计模式有限制,用错了场景依然不是好的设计。

害处一,隐式依赖引起的结构不清晰

有的时候,你并不知道要使用的那个类 A 是单例。当你读类 B 代码的时候,你可能会先看它的头文件,或 VC 类视图里的内容,从这里你无法知道 B 类和 A 类的关系,因为 B 类在实现的时候才使用 A 类的那个所谓“ GetInstance ”之类的函数,读不到这一行,就不会知道 B 类对依赖 A 类的依赖关系。

害处二,多个实例的限制

有人可能会说了,单例就是防止多实例的,这算什么害处呢?确实,但实际情况是,许多被定义成单例的 类,并不是非得单例不可。有的人使用单例,只是为了在引用它的时候方便,把单例当个全局变量一样,拿过来就用,从而免去设置实例间引用关系的代码。可是随 着项目的发展,麻烦可能会不期而至。比如:需要一个新的 A 类的实例来支持一个新的功能场景,或者 B 类需要在 A 类的实例和另一个类的实例中选择一个来实现功能。

害处三,单例类的扩展限制

单例类没办法通过继承的方式扩展。因为那个 GetInstance 静态函数没办法生成子类的实例。如果你想给单例类扩展点接口,只有直接修改那个类了。想利用它来生 成一个更丰富的子类是不可能的。

害处四,程序结束时的内存泄漏

有些人认为程序都结束了,漏一点内存没问题。但我不这么认为。没有正确析构的实例,漏的可能不只是内 存,还有其它资源未释放的危险。我所读到的设计模式那本书上并没有详细描述实例释放的问题,所以我看到很多人写的单例代码也没有实例释放控制这一段,这使 内存泄漏成了必然结果。我在以前的博客中讨论过单例的释放方法,叫《单例模式的释放控制》,有兴趣的朋友可以看一下。

以上主要是针对大多数单例模式的实现而言的。这些实现类似书《设计模式》那本书上的描述,保护的构造 函数, GetInstance 得到实例。其它方法实现的单例不在本文的讨论之列。

对说初学者来说,很难把握住“变化”。也许当初以为只有一个实例,以后会有多个,这就会受到害处二的 限制。以我的观点来看,尽量不要用它,我们来有更多更明了的方式来建立两个类的关系。

单例模式是一种限制性模式。如果你并不需要限制,就不要受 GetInstance 方式获取实例的诱惑, 它比全局变量好不了多少。

 

 

分享到:
评论

相关推荐

    普遍管辖权滥用认定标准探讨

    普遍管辖权是近年国际法热点问题,其适用引发滥用争议。为解决问题、达成共识,根据现有国际法规范,结合法理与实践,提出判断权力滥用的两个标准:普遍管辖权的行使是否具有法律依据,是否尊重他国主权豁免。适用普遍管辖...

    Javascript设计模式源码

    作者针对常见的开发任务,从YUI等实战代码中取材,提供了专家级的解决方案,不仅透彻剖析了JavaScript扣的面向对象编程,而且深入探讨了如何用JavaScript实现以前只在服务器端应用的设计模式,如何根据实际场景选择...

    2014移动设计模式

    UI设计模式经常被曲解和滥用,在写这本电子书的时候我就有所了解,希望你们也能有所注 意。 很多时候,UI设计模式被误解为那些可以直接套用《设计模式与线框图库》中范例的元素或功 能。范例的确能开个好头,但还远...

    Head First 设计模式(高清中文完整版带目录+附书源码+HeadFirst设计模式学习伴侣.rar).7z.002(2-2)

     ·何时不该使用该模式(如何避免滥用模式);  ·某个模式是依据哪些面向对象设计原理而设计出来的。  更重要的是,你想在学习设计模式的过程中,不感觉到昏昏欲睡。如果你曾经读过任何一本深入浅出(Head ...

    深入浅出设计模式英文影印版 Part 1/4

     ·何时不该使用该模式(如何避免滥用模式);  ·某个模式是依据哪些面向对象设计原理而设计出来的。  更重要的是,你想在学习设计模式的过程中,不感觉到昏昏欲睡。如果你曾经读过任何一本深入浅出(Head ...

    各国玩具物理机械滥用测试标准

    个人制作的各国玩具物理机械滥用测试标准表,可以减少查资料的苦恼,供各位同道参考,

    如何应对知识产权滥用:分析与对策

    知识产权制度自创设之初就赋予了其鼓励创新和促进技术传播的双重功能,然而目前愈演愈烈的知识产权滥用行为阻止了这一功能的实现,使得知识产权制度成为权利人垄断市场、限制竞争、遏止创新的工具。我国已经建立起了...

    论文研究 - 打击保险滥用:土耳其和英国的比较分析

    保险欺诈可以定义为受益人故意诱骗保险公司,目的是在签发保单之前或之后获得财务收益。... 本研究旨在概述土耳其和英国保险滥用的类型,规模和影响。 它还旨在指定土耳其和英国也针对打击保险滥用的措施和机构。

    react-global-event-decorator:滥用装饰器模式

    滥用装饰器模式 安装 如果您有风险,请继续使用此功能。 你是大人 npm install --save react-global-event-decorator 这个是来做什么的? 当您单击DOM中的任意位置时,曾经有一个React组件需要执行操作吗? 它...

    Head First设计模式.part1

     ·何时不该使用该模式(如何避免滥用模式);  ·某个模式是依据哪些面向对象设计原理而设计出来的。  更重要的是,你想在学习设计模式的过程中,不感觉到昏昏欲睡。如果你曾经读过任何一本深入浅出(Head ...

    滥用抗生素的危害及防治措施.doc

    滥用抗生素的危害及防治措施.doc

    Head First设计模式.part4

     ·何时不该使用该模式(如何避免滥用模式);  ·某个模式是依据哪些面向对象设计原理而设计出来的。  更重要的是,你想在学习设计模式的过程中,不感觉到昏昏欲睡。如果你曾经读过任何一本深入浅出(Head ...

    Head First设计模式.part3

     ·何时不该使用该模式(如何避免滥用模式);  ·某个模式是依据哪些面向对象设计原理而设计出来的。  更重要的是,你想在学习设计模式的过程中,不感觉到昏昏欲睡。如果你曾经读过任何一本深入浅出(Head ...

    Head First设计模式.part5

     ·何时不该使用该模式(如何避免滥用模式);  ·某个模式是依据哪些面向对象设计原理而设计出来的。  更重要的是,你想在学习设计模式的过程中,不感觉到昏昏欲睡。如果你曾经读过任何一本深入浅出(Head ...

    Head First设计模式.part2

     ·何时不该使用该模式(如何避免滥用模式);  ·某个模式是依据哪些面向对象设计原理而设计出来的。  更重要的是,你想在学习设计模式的过程中,不感觉到昏昏欲睡。如果你曾经读过任何一本深入浅出(Head ...

    深入浅出设计模式 part1

     ·何时不该使用该模式(如何避免滥用模式);  ·某个模式是依据哪些面向对象设计原理而设计出来的。  更重要的是,你想在学习设计模式的过程中,不感觉到昏昏欲睡。如果你曾经读过任何一本深入浅出(Head First...

    深入浅出设计模式 part2

     ·何时不该使用该模式(如何避免滥用模式);  ·某个模式是依据哪些面向对象设计原理而设计出来的。  更重要的是,你想在学习设计模式的过程中,不感觉到昏昏欲睡。如果你曾经读过任何一本深入浅出(Head First...

    深入浅出设计模式 part3

     ·何时不该使用该模式(如何避免滥用模式);  ·某个模式是依据哪些面向对象设计原理而设计出来的。  更重要的是,你想在学习设计模式的过程中,不感觉到昏昏欲睡。如果你曾经读过任何一本深入浅出(Head First...

    加强知识产权战略管理和实施中的制度建设——关于知识产权滥用的法律规制制度

    文中首先十分扼要的梳理了知识产权滥用在英国、美国、欧盟及加拿大等国法律中的含义及其相应规制制度,可以发现:知识产权滥用概念的界定及其规制制度与民法中的"权利滥用原则"几乎不存在任何制度上的渊源关系。...

    抗生素滥用问题的思考开题报告.pdf

    抗生素滥用问题的思考开题报告.pdf

Global site tag (gtag.js) - Google Analytics