73. 抵制单件模式的诱惑

翻译 2013年12月05日 23:52:36

抵制单件模式的诱惑

        单件模式解决了你的很多问题,知道你只需要一个单一的实例,你可以确定这个实例在使用前已经初始化了,它通过一个唯一的全局访问点让你的设计变得简单。有何理由不喜欢这个经典的设计模式呢?
        结果是,有很多理由。尽管很诱人,但经验显示大多数单件实际上的坏处比好处要多。不幸的是,这个额外的智慧并没有像它应该的那样广为传播,单件也继续让很多程序员感到充满了诱惑。但它是需要抵制的:
        · 单个实例的需求经常是假想出来的。很多场景中,将来不需要其它的实例只不过是一种猜测。在应用程序的设计中传播这种猜测性的属性一定会在某个时候导致痛苦。需求是会改变的。好的设计拥抱需求的改变,而单件则不会。
        · 单件在概念上彼此独立的代码单元中产生隐式的依赖。这是有问题的,既因为它们是隐藏的,也因为它们在单元中引入了不必要的耦合。当你尝试写单元测试时,代码的味道就变得刺鼻了。单元测试依赖于松耦合以及选择性地使用一个模拟的实现代替真正的实现。单件会阻止这种直接的模拟。
        · 单件也带有隐式的持续状态,这又会妨碍单元测试。单元测试依赖于各个测试之间的独立性,这样测试用例就能以任何顺序运行,而且程序也可以在执行某个测试用例之前设定为一个已知的状态。一旦引入了单件中的可变状态,这就很难实现了。此外,这种全局访问的持续状态让推理代码变得更加困难,特别是在多线程环境中。
        · 多线程给单件模式带了更多的陷阱。由于直接的锁定效率不高,所谓的双重检查锁定模式(DCLP)就广受欢迎。不幸的是,这可能是更进一步形式的致命诱惑。结果是在很多语言中,DCLP都不是线程安全的,而即便是线程安全的,仍然有机会出现一些微妙的错误。
        单件的清理可能是一个最终的挑战:
        · 单件不支持显式的结束,这在某些环境中可能是严重问题。比如,在一个插件架构中,某个插件只有在其它对象都清理后才能安全地卸载。
        · 程序结束时,单件的隐式地清理是没有顺序的。这在包含了互相依赖的单件的应用程序中就很麻烦,一个单件可能会访问其它已经销毁了的。
        这些之中的某些缺点可以通过引入额外的机制来克服,然而,随之而来的是代码额外的复杂度的增加,这本可以通过选择其它的设计来避免的。
        因而,严格限制自己仅在真正只安装一次的类上使用单件模式。不要随意地在代码中使用单件的全局访问点。取而代之的是,只能从一些定义良好的地方进行单件的直接访问,从可以通过接口为其它代码提供访问的地方。其它代码是未知的,所以不要依赖单件或者其它类是否实现了接口。这就打破了阻挠单件测试的依赖性,增强了可维护性。所以,下次考虑实现或者访问一个单件时,希望能暂停一下,三思。

原文:Resist the Temptation of the Singleton Pattern by Sam Saariste

单件模式(Singleton Pattern)(一):单件模式介绍

一、意图          单件模式(又称单例模式)确保一个类只有一个实例,并提供一个全局访问点。 二、适用性 1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问...
  • jialinqiang
  • jialinqiang
  • 2013年05月11日 09:23
  • 3911

Java设计模式——单件模式

有一些对象其实我们只需要一个,比方说:线程池(threadpool)、缓存(cache)、对话框、处理偏好设置和注册表(registry)的对象、日志对象,充当打印机、显卡等设备的驱动程序的对象。事实...
  • u013761665
  • u013761665
  • 2015年05月26日 14:25
  • 3488

C++单件模式的实现

单件模式:其实就是保证了一个类有且仅有一个对像,又提供一个全局访问方法。对某些类来说,希望它只有一个对像,那么用单件模式设计再好不过了。很多人在刚开始时不知道Ogre中getSingleton()、g...
  • fanwenyuan_fwy
  • fanwenyuan_fwy
  • 2014年08月08日 11:49
  • 482

多线程安全的Singleton单件模式在C++,java与C#下的实现

单件模式就是全局只能被创建一个对象,在没有多线程的情况粗糙的代码还可以     class Singleton { private: static Singleton* Instanc...
  • XiaoPANGXia
  • XiaoPANGXia
  • 2015年04月18日 22:39
  • 1320

c++ 设计模式之单件模式

转载地址:http://blog.csdn.net/lbqbraveheart/article/details/7084509 单件模式应该是所有设计模式中最简单的一个了,但是如果使用不当会出现...
  • u012398613
  • u012398613
  • 2016年04月12日 20:31
  • 302

设计模式之单件模式

有人说单件模式是最简单的模式,因为它只有一个类,但其实它还有一些值得注意的地方,就如:出现并发性时,单件可能已经不是单件了。     先说一下,我们为什么要用到单件模式,当我们用到这些对象如:线程池,...
  • u012367513
  • u012367513
  • 2014年07月19日 15:38
  • 1892

C++ 单件模式实现及对象释放

单件模式: 单件模式即在整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享的。 单件模式的C++实现(构造函数、拷贝构造函数、赋值操作符均需重写): #include clas...
  • zxwangyun
  • zxwangyun
  • 2014年06月10日 13:52
  • 1526

单件模式(单例模式)

【0】README 0.1)本文部分描述转自 “head first 设计模式”, 旨在学习 单件模式(单例模式) 的相关知识 及其应用; 【1】单件模式 1.0)单件模式的应用背景:有一些对象其...
  • PacosonSWJTU
  • PacosonSWJTU
  • 2016年03月10日 15:37
  • 393

车抵借款协议书

车抵借款协议书 甲方:          身份证号:                                     乙方:          身份证号:                   ...
  • wangxueming
  • wangxueming
  • 2017年06月13日 11:30
  • 498

C语言之单件模式完全实现

#include #inlcude #inlucde #define TRUE 1 #define FLASE 0 typedef struct { int  age; int num;...
  • hel12he
  • hel12he
  • 2013年09月05日 09:32
  • 992
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:73. 抵制单件模式的诱惑
举报原因:
原因补充:

(最多只允许输入30个字)