Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 单身汉:好的设计还是拐杖?_Language Agnostic_Design Patterns_Singleton - Fatal编程技术网

Language agnostic 单身汉:好的设计还是拐杖?

Language agnostic 单身汉:好的设计还是拐杖?,language-agnostic,design-patterns,singleton,Language Agnostic,Design Patterns,Singleton,Singleton是一种备受争议的设计模式,因此我对Stack Overflow社区对它们的看法很感兴趣 请为您的观点提供理由,而不仅仅是“单身是为懒惰的程序员准备的!” 这是一篇关于这个问题的相当好的文章,尽管它反对使用单身汉: 有人有其他关于它们的好文章吗?可能是为了支持单例?单例的目的是确保类只有一个实例,并提供对它的全局访问点。大多数情况下,焦点都集中在单个实例点上。想象一下,如果它被称为环球顿。这听起来不太吸引人,因为这强调了(通常)全局变量的负面含义 大多数反对单例的好论据都与它们

Singleton是一种备受争议的设计模式,因此我对Stack Overflow社区对它们的看法很感兴趣

请为您的观点提供理由,而不仅仅是“单身是为懒惰的程序员准备的!”

这是一篇关于这个问题的相当好的文章,尽管它反对使用单身汉:


有人有其他关于它们的好文章吗?可能是为了支持单例?

单例的目的是确保类只有一个实例,并提供对它的全局访问点。大多数情况下,焦点都集中在单个实例点上。想象一下,如果它被称为环球顿。这听起来不太吸引人,因为这强调了(通常)全局变量的负面含义


大多数反对单例的好论据都与它们在测试中的困难有关,因为为它们创建双重测试并不容易。

单例有它们的用途,但在使用和公开它们时必须小心,因为它们很难真正进行单元测试,而且,基于两个相互访问的单例创建循环依赖关系也很容易


但是,当您希望确保所有数据跨多个实例(例如,分布式应用程序的配置)进行同步时,这会很有帮助,可以依靠单例来确保所有连接都使用相同的最新数据集。

单例只是一堆奇装异服的全局变量

全局变量也有其用途,就像单例一样,但是如果你认为你正在用单例做一些很酷和有用的事情,而不是用一个讨厌的全局变量(每个人都知道全局变量是不好的,嗯,是的),不幸的是,你被误导了。

谷歌有一个Java应用程序,我相信它最初是作为一个工具,必须在谷歌生成的所有代码上运行。删除单例的主要原因:

因为他们可以进行测试 困难和隐藏的问题与您的 设计


有关更明确的解释,请参见Google的“”。

我发现您必须非常小心为什么决定使用singleton。正如其他人提到的,它本质上与使用全局变量是同一个问题。你必须非常谨慎,并考虑使用一个可以做的事情。
使用它们是非常罕见的,通常有更好的方法来做事情。我遇到过这样的情况:我对一个单身汉做了一些事情,然后在我发现它让事情变得更糟(或者在我想出了一个更好、更理智的解决方案)之后,我不得不筛选我的代码以将其删除。

我一直在努力想办法拯救可怜的singelton,但我必须承认这很难。我很少看到它们的合法使用,而且在当前的依赖注入和D单元测试驱动下,它们很难使用。他们肯定是设计模式编程的“货物崇拜”表现形式。我与许多程序员一起工作过,他们从未读过“GoF”一书,但他们知道“Singelton”,因此他们知道“模式”

不过我不同意猎户座的说法,大多数时候我看到singeltons被过度使用,这不是衣服上的全局变量,而是衣服上的全局服务(方法)。有趣的是,如果您试图通过CLR接口以安全模式在SQLServer2005中使用Singelton,系统将标记代码。问题在于,在可能运行的任何给定事务之外都有持久性数据,当然,如果将实例变量设置为只读,则可以绕过该问题

这个问题导致我一年内做了大量的修改。

我真的不同意一个化装想法中的一堆全局变量。单例在解决正确的问题时非常有用。让我给你举个真实的例子

我曾经在我工作的地方开发了一个小软件,有些表单必须使用有关公司、员工、服务和价格的信息。在第一个版本中,每次打开表单时,系统都会从数据库中加载数据。当然,我很快意识到这种方法不是最好的

然后我创建了一个名为company的单例类,它封装了这个地方的所有信息,当系统打开时,它已经完全充满了数据

这不仅仅是一堆装模作样的变量,因为这有几十项职责,比如与持久层通信以保存/检索有关公司的数据、处理员工和价格收集等

此外,它是一个固定的、全系统的、易于访问的点,用于获取公司数据

这不仅仅是一堆装模作样的变量,因为这有几十项职责,比如与持久层通信以保存/检索有关公司的数据、处理员工和价格收集等

我必须说,您并不是在真正描述某个应该是单个对象的东西,除了数据序列化之外,它们中的任何一个都应该是单个对象,这是有争议的

我可以看到至少3组我通常在其中设计的类,但我倾向于使用较小的简单对象,它们可以很好地完成一组狭窄的任务。我知道这不是大多数程序员的天性。(是的,我每天处理5000行类怪物,我特别喜欢一些人编写的1200行方法。)


我想重点是,在大多数情况下,你不需要一个歌手,而你的音乐往往只是让你的生活更艰难。

圣战!好的,让我想想。。上次我检查设计时警察说

单例是不好的,因为它们阻碍了自动测试——不能为每个测试用例重新创建实例。 相反,逻辑应该在一个易于实例化和测试的类(a)中。另一个类(B)应该负责约束创建。单一责任原则