原文链接:http://blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx

虽然这篇文章不是我写的,但我完全同意文章中的观点。Brian Button可能是我所知道的最有才的人之一。我相信他会喜欢你们的反馈的。

1、单例模式经常被用来为某些服务提供一个全局访问点
没错,是可以这么做,但代价是什么呢?众所周知,单例模式为你的应用程序中的某些服务提供全局访问点,这样你就不必到处传递一个该服务的引用。这和一个全局变量有什么区别呢?(记住,全局变量是不好的,不是吗?)最终会发生的事情便是你设计中的依赖关系是隐藏在代码中的,这种依赖关系不能够通过检查你的类和方法的接口所见。你必须检查代码以便准确地知道你的类中都用了哪些其他对象。这可能会是不清楚的(译者注:不知道是不是这么翻译,原文:This is less clear than it could be)。冲动地创建一个全局性的东西来避免把其传来传去是你设计中的异味,这不是全局变量或者单例的功能。如果你更仔细地检查你的设计,你几乎总是能想到一种不必把“流浪数据”四处传递到每个对象和方法的更好的设计。

2、单例模式允许你限制你所创建的对象的数量
这也是对的,但是现在你混合了两个不同的职责到同一个类中了,这是违反了单一职责原则的。一个类不应该关心它是否是一个单例,它应该仅仅关心它的业务职责。如果你想限制某些类的实例化能力,创建一个封装了创建并且如你所愿的那样限制创建能力的工厂或者对象生成器,这样创建职责便从业务实体职责中划分出来了。

3、单例模式促进了类之间的紧耦合
使代码是可测试的一个基本属性便是它和其周围环境是松耦合的。这个属性允许你在测试过程中为了实现特定的测试目标(想想模拟对象)替换备用的合作者。单例模式把单例对象的确切类型紧耦合在一起,丧失了使用多态来替换的机会。一个更好的选择,如上面第一点所讨论到的,便是改变你的设计以便允许你传递对象的引用到你的类和方法中,这样可以减轻上述的耦合问题。

4、单例模式在程序的持续过程中一直保存着上一次的状态
持久状态是单元测试的敌人。让单元测试有效的事情之一便是每个测试必须独立于其他所有测试。如果不是这样,那么测试运行的顺序会影响到测试的结果。这可能会导致测试在不应该失败的地方失败,甚至更坏的事情是仅仅因为测试的运行顺序导致测试通过。这可能会隐藏住bugs并且是邪恶的。防止状态从一个测试携带到另一个测试的一个很好办法便是避免使用静态变量。单例模式,就其本质而言,依赖于在一个静态变量中保存着一个实例。这是测试依赖的一个挑战,可以通过传递对象的引用到你的类和方法中来避免。

希望这篇文章或多或少地阐释了我对于单例模式观点。我有一个从google或者其他地方找到的一个小链接集,包括Jim Hyslop和Herb Sutter,他们同样分享了这些观点。如果你喜欢他们那么让我知道吧。

转载于:https://www.cnblogs.com/shower/p/3738754.html

为什么单例模式是邪恶的(译)相关推荐

  1. [译]Object的局限性——Kotlin中的带参单例模式

    原文:Kotlin singletons with argument --object has its limits 作者:Christophe Beyls 译者:却把清梅嗅 在Kotlin中,单例模 ...

  2. 【C++】C/C++ 中的单例模式

    目录 part 0:单例模式3种经典的实现方式 Meyer's Singleton Meyers Singleton版本二 Lazy Singleton Eager Singleton Testing ...

  3. 在Java中实现单例模式的有效方法是什么? [关闭]

    在Java中实现单例模式的有效方法是什么? #1楼 我使用Spring框架来管理我的单身人士. 它不会强制类的"单一性"(如果涉及多个类加载器,您将无法真正做到),但是它提供了一种 ...

  4. [译] Cilium:BPF 和 XDP 参考指南(2021)

    Cilium:BPF和XDP参考指南_RToax-CSDN博客Table of ContentsBPF体系结构指令系统辅助功能地图对象固定尾叫BPF到BPF呼叫准时制硬化减负工具链开发环境虚拟机本文档 ...

  5. 英语 译林 2019 单词表

    词汇表 英语 译林 2019 单词表 必修一 必修二 必修三 英语 译林 2019 单词表 必修一 Unit 1 Back to school potential /pəˈtenʃl/ n. 潜力;可 ...

  6. [译]带你揭开Kotlin中属性代理和懒加载语法糖衣

    翻译说明: 原标题: How Kotlin's delegated properties and lazy-initialization work 原文地址: https://medium.com/t ...

  7. [译]Kotlin的独门秘籍Reified实化类型参数(上篇)

    翻译说明: 原标题: Getting Real with Kotlin's Reified Type Parameters 原文地址: https://typealias.com/guides/get ...

  8. 大学英语综合教程三 Unit 8 课文内容英译中 中英翻译

    大学英语综合教程三 Unit 8 课文内容英译中 中英翻译   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客 本文 ...

  9. [译]Kotlin中是应该使用序列(Sequences)还是集合(Lists)?

    翻译说明: 原标题: Sequences - a Pragmatic Approach 原文地址: https://proandroiddev.com/sequences-a-pragmatic-ap ...

最新文章

  1. 粤港澳大湾区菜篮子-哲商对话·林裕豪:从玉农业谋定标准
  2. ABAP:为Table Control创建Context Menu
  3. 住宅按套内面积算,医院人脸识别黄牛,DNA碱基对可能会扩充,菜鸟发布供应链系统,猪瘟不影响食品安全,这就是今天的大新闻...
  4. D - Maximum Value Problem FZU - 2037
  5. python celery应用场景_Celery使用背景与功能概要
  6. ubuntu12.04 java配置_Ubuntu 12.04 中安装和配置 Java JDK
  7. php访问父类的所有属性,php – 在父类中使用$this仅在子类中显示父类属性
  8. dns提供商主机名_在 Kubernetes 中使用 DNS 和 Headless Service 发现运行中的 Pod
  9. maven-3.5.3通过eclipse打包问题(1)
  10. Know Difference between Oracle Reserved Words and Keywords
  11. 【2019杭电多校第七场1006=HDU6651】Final Exam(思维转换)
  12. hdfs命令,hadoop基本常用命令
  13. [Python从零到壹] 三十四.OpenCV入门详解——显示读取修改及保存图像
  14. 在韩家炜老师的实验室和家里作客 — 旅美散记之二
  15. JavaScript:延迟访问和延时执行函数
  16. 搭建sspanel 教程三(后端教程)
  17. 服务端渲染SSR及实现原理
  18. 实训六 思科路由器配置静态路由
  19. 迭代数据流分析中的逆后序(Reverse Postorder)
  20. 练气六层 —— 重要知识点总结

热门文章

  1. python离线安装包_Python2.7如何离线安装包
  2. udp 使用connect优点_nodejs源码分析第十九章 -- udp模块
  3. php如果字符串有1 3 5,Day3-php 字符串1
  4. 计算机指令取决,不同的计算机,其指令不同,这主要取决于什么?
  5. 鸿蒙os内测版应用名称,谁知道报名鸿蒙系统公测,应用名称怎么填的?
  6. matlab优化 带参数设置,优化选项参考 - MATLAB Simulink - MathWorks 中国
  7. 工业级以太网交换机的应用领域有哪些?
  8. 【渝粤题库】广东开放大学 公共部门人力资源管理 形成性考核
  9. ZigBee技术的应用和优势
  10. datatable如何生成级联数据_如何把Excel表数据批量生成条形码