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
Design patterns 工厂能取代单身汉吗?_Design Patterns_Singleton_Factory - Fatal编程技术网

Design patterns 工厂能取代单身汉吗?

Design patterns 工厂能取代单身汉吗?,design-patterns,singleton,factory,Design Patterns,Singleton,Factory,已经有很多关于单例模式的帖子,但是我想在这个主题上再开始一篇,因为我想知道工厂模式是否是删除这个“反模式”的正确方法 在过去,我经常使用singleton,我的同事也用过,因为它很容易使用。例如,EclipseIDE或更好的工作台模型也大量使用了单例。这是因为一些关于E4(下一个大型Eclipse版本)的帖子让我开始重新思考singleton 归根结底,由于这个单例,Eclipse3.x中的依赖项是紧密耦合的 假设我想完全摆脱所有的单例,而使用工厂。 我的想法如下: 隐藏复杂性 少耦合 我能控

已经有很多关于单例模式的帖子,但是我想在这个主题上再开始一篇,因为我想知道工厂模式是否是删除这个“反模式”的正确方法

在过去,我经常使用singleton,我的同事也用过,因为它很容易使用。例如,EclipseIDE或更好的工作台模型也大量使用了单例。这是因为一些关于E4(下一个大型Eclipse版本)的帖子让我开始重新思考singleton

归根结底,由于这个单例,Eclipse3.x中的依赖项是紧密耦合的

假设我想完全摆脱所有的单例,而使用工厂。
我的想法如下:

  • 隐藏复杂性
  • 少耦合
  • 我能控制多少人 创建实例(只需存储 参考I是一个 工厂)
  • 模拟工厂进行测试(使用依赖项注入) 当它位于接口后面时
  • 在某些情况下,工厂可以制造 不止一个单例已过时 (视业务而定) 逻辑/组件组成)
这有意义吗? 如果没有,请给出你这样认为的充分理由。我们也希望有一个替代方案

谢谢


马克

我同意它有时是有道理的。然而,这取决于你在建什么

如果你仅仅因为“更好”就用工厂取代了每一个单体,那么你就错了。 它应该是有目的的。若你们不打算去模仿,若你们确定你们只需要一个实例,那个么替换就是“架构的美化”(architecture mastrubation)


别误会,架构非常重要,但你不应该做得太过分。

设计模式中描述的单例通常使用静态变量,这使得代码很难测试

我建议阅读Miško Hevery和两篇后续文章。 在这里,他描述了在设计模式中具有单个实例的对象和类似于单个对象的对象之间的区别,以及应该首选第一个实例


因此,在我看来,您所描述的方法是可行的。

在我的理解中,您不能用工厂来“替换”一个单件,但您可以同时使用这些模式。工厂将向工厂方法的调用方返回对象的实例。如果您想确保工厂只返回一个特定对象的实例,那么该对象应该是单实例。你把单身汉藏在工厂里了

如果将对象的私有实例存储在工厂中,而不是对象本身中,那么如何确保系统中只有一个对象实例?您如何强制该对象只能由您的工厂创建


你可以用IoC来代替单打,事实上,作为反模式的单打似乎有很多不好的感觉,甚至Gamma说他希望自己把它从GoF的书中删掉…

工厂绝对是单打的替代品,我更喜欢前者而不是后者。单件很难测试,导致紧密耦合。工厂,如果正确实现(使用纯接口等),将导致更多的可测试代码和更少的耦合


也就是说,这并不意味着你应该把工厂当作解决所有问题的大锤。还有其他一些模式也可以导致比单例更少的耦合,但这是一个更合适的解决方案。例如:控制反转。

在我看来,单例的主要缺点是紧密耦合(其后果包括糟糕的测试等)

工厂模式允许更松散的耦合程度,所以是的:用工厂取代单例听起来是个好主意


如前所述,工厂有时也会变成单身。然而,工厂至少不会返回自身的实例,而是返回一些接口实现的实例,这是一个巨大的优势

单例当然是一种反模式。如果你正在使用TDD,你应该避免这样的解决方案。任何IoC框架(如Windsor或Unity)都可以为您模拟此功能,而无需可怕的静态类。然而,如果您不使用TDD,并且您的项目非常简单,那么您可以使用它。顺便说一句,我推荐IoC框架而不是自制工厂。不要发明轮子。

我还不知道如何比较这两种模式。据我所知,两者完全不同(除了它属于同一个类别——创造模式——在这个世界上,更多的是模式本身。我的意思是,试图将一种基本模式转换为另一种基本模式……这听起来像是一种过度模式化的思维。感谢所有的答案和参考链接。@SysAdmin:对,它们是创造模式,因此为您提供了关于对象的引用。由于单件越来越被称为反模式,我在问工厂是否可以用于我过去使用单件的目的。感谢链接。我实际上是在不久前偶然看到这篇文章的,但后来我失去了链接(我只记得第一点).是的,我正试图尽可能多地使用TDD,但我仍试图将IoC汇总的数据量保持在一个适中的比率(组件组成)。Spring的拥护者总是说,你用它编写的代码太少,但他们忘了提到庞大的xml文件:-)嗯,我可以说Spring并不是.NET的最佳IoC解决方案。它功能强大,但不便于用户使用。特别是由于其糟糕的配置。试试Windsor或Unity——更好)的优点。关于你的观点,当我在Facroty中放置一个私有实例时,如何确保一个类只有一个实例:我将对象设为“package p”