Language agnostic 单身汉:好的设计还是拐杖?
Singleton是一种备受争议的设计模式,因此我对Stack Overflow社区对它们的看法很感兴趣 请为您的观点提供理由,而不仅仅是“单身是为懒惰的程序员准备的!” 这是一篇关于这个问题的相当好的文章,尽管它反对使用单身汉:Language agnostic 单身汉:好的设计还是拐杖?,language-agnostic,design-patterns,singleton,Language Agnostic,Design Patterns,Singleton,Singleton是一种备受争议的设计模式,因此我对Stack Overflow社区对它们的看法很感兴趣 请为您的观点提供理由,而不仅仅是“单身是为懒惰的程序员准备的!” 这是一篇关于这个问题的相当好的文章,尽管它反对使用单身汉: 有人有其他关于它们的好文章吗?可能是为了支持单例?单例的目的是确保类只有一个实例,并提供对它的全局访问点。大多数情况下,焦点都集中在单个实例点上。想象一下,如果它被称为环球顿。这听起来不太吸引人,因为这强调了(通常)全局变量的负面含义 大多数反对单例的好论据都与它们
有人有其他关于它们的好文章吗?可能是为了支持单例?单例的目的是确保类只有一个实例,并提供对它的全局访问点。大多数情况下,焦点都集中在单个实例点上。想象一下,如果它被称为环球顿。这听起来不太吸引人,因为这强调了(通常)全局变量的负面含义
大多数反对单例的好论据都与它们在测试中的困难有关,因为为它们创建双重测试并不容易。单例有它们的用途,但在使用和公开它们时必须小心,因为它们很难真正进行单元测试,而且,基于两个相互访问的单例创建循环依赖关系也很容易
但是,当您希望确保所有数据跨多个实例(例如,分布式应用程序的配置)进行同步时,这会很有帮助,可以依靠单例来确保所有连接都使用相同的最新数据集。单例只是一堆奇装异服的全局变量 全局变量也有其用途,就像单例一样,但是如果你认为你正在用单例做一些很酷和有用的事情,而不是用一个讨厌的全局变量(每个人都知道全局变量是不好的,嗯,是的),不幸的是,你被误导了。谷歌有一个Java应用程序,我相信它最初是作为一个工具,必须在谷歌生成的所有代码上运行。删除单例的主要原因: 因为他们可以进行测试 困难和隐藏的问题与您的 设计
有关更明确的解释,请参见Google的“”。我发现您必须非常小心为什么决定使用singleton。正如其他人提到的,它本质上与使用全局变量是同一个问题。你必须非常谨慎,并考虑使用一个可以做的事情。
使用它们是非常罕见的,通常有更好的方法来做事情。我遇到过这样的情况:我对一个单身汉做了一些事情,然后在我发现它让事情变得更糟(或者在我想出了一个更好、更理智的解决方案)之后,我不得不筛选我的代码以将其删除。我一直在努力想办法拯救可怜的singelton,但我必须承认这很难。我很少看到它们的合法使用,而且在当前的依赖注入和D单元测试驱动下,它们很难使用。他们肯定是设计模式编程的“货物崇拜”表现形式。我与许多程序员一起工作过,他们从未读过“GoF”一书,但他们知道“Singelton”,因此他们知道“模式” 不过我不同意猎户座的说法,大多数时候我看到singeltons被过度使用,这不是衣服上的全局变量,而是衣服上的全局服务(方法)。有趣的是,如果您试图通过CLR接口以安全模式在SQLServer2005中使用Singelton,系统将标记代码。问题在于,在可能运行的任何给定事务之外都有持久性数据,当然,如果将实例变量设置为只读,则可以绕过该问题 这个问题导致我一年内做了大量的修改。我真的不同意一个化装想法中的一堆全局变量。单例在解决正确的问题时非常有用。让我给你举个真实的例子 我曾经在我工作的地方开发了一个小软件,有些表单必须使用有关公司、员工、服务和价格的信息。在第一个版本中,每次打开表单时,系统都会从数据库中加载数据。当然,我很快意识到这种方法不是最好的 然后我创建了一个名为company的单例类,它封装了这个地方的所有信息,当系统打开时,它已经完全充满了数据 这不仅仅是一堆装模作样的变量,因为这有几十项职责,比如与持久层通信以保存/检索有关公司的数据、处理员工和价格收集等 此外,它是一个固定的、全系统的、易于访问的点,用于获取公司数据 这不仅仅是一堆装模作样的变量,因为这有几十项职责,比如与持久层通信以保存/检索有关公司的数据、处理员工和价格收集等 我必须说,您并不是在真正描述某个应该是单个对象的东西,除了数据序列化之外,它们中的任何一个都应该是单个对象,这是有争议的 我可以看到至少3组我通常在其中设计的类,但我倾向于使用较小的简单对象,它们可以很好地完成一组狭窄的任务。我知道这不是大多数程序员的天性。(是的,我每天处理5000行类怪物,我特别喜欢一些人编写的1200行方法。)
我想重点是,在大多数情况下,你不需要一个歌手,而你的音乐往往只是让你的生活更艰难。圣战!好的,让我想想。。上次我检查设计时警察说 单例是不好的,因为它们阻碍了自动测试——不能为每个测试用例重新创建实例。 相反,逻辑应该在一个易于实例化和测试的类(a)中。另一个类(B)应该负责约束创建。单一责任原则