Singleton可以被Factory取代吗?

时间:2010-05-04 11:11:19

标签: design-patterns singleton factory

已经有一些关于Singleton-Pattern的帖子了,但是我想在这个主题上再开一个,因为我想知道Factory-Pattern是否是正确的方法来删除这个“反模式” ”

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

最重要的是,由于这些单身人士,Eclipse 3.x中的家属紧密耦合。

让我们假设我想完全摆脱所有单身人士,而是使用工厂。
我的想法如下:

  • 隐藏复杂性
  • less coupling
  • 我控制了多少 实例被创建(只存储 引用我的私人领域 厂)
  • 模拟工厂进行测试(使用依赖注入) 当它在界面后面时
  • 在某些情况下,工厂可以制造 不止一个单身人士已经过时了 (取决于业务 逻辑/组件组成)

这有意义吗? 如果没有,请说明您为什么这么认为的原因。另一种解决方案也值得赞赏。

由于

马克

6 个答案:

答案 0 :(得分:9)

我同意它有时会产生感官。但是,这取决于你正在建设什么。

如果你用工厂取代每一个单身只是因为它“更好”,那你就错了imho。 它应该有用。如果你不打算嘲笑,如果你确定你只需要一个实例,那么替换只是“建筑mastrubation”;)

不要误解我的意思,架构非常重要,但你不应该过分。

答案 1 :(得分:4)

在我看来,单身人士的主要缺点是紧密耦合(所有后果都像蹩脚的测试等)。

工厂模式允许更宽松的耦合程度,所以是的:用工厂替换单身人士听起来是个好主意。

正如Peter Kelly提到的那样,工厂有时也可能最终成为单身人士。但是,工厂至少不返回自己的实例,而是返回某个接口实现的实例,这是一个巨大的优势。

答案 2 :(得分:3)

根据我的理解,你不能用工厂“替换”Singleton,但你可以一起使用这些模式。 Factory会将对象的实例返回给Factory方法的调用者。如果要确保Factory返回的特定对象只有一个实例,那么该对象应该是Singleton。你正在工厂里隐藏Singleton。

如果要将对象的私有实例存储在Factory中而不是存储在对象本身中 - 那么如何强制系统中只有一个对象实例?你怎么能强制你的工厂只创造那个对象?

你可以用IoC替换一个Singleton,事实上似乎对Singleton作为反模式有很多不好的感觉,甚至Gamma说他希望他把它从GoF书中删除...... < / p>

答案 3 :(得分:2)

工厂肯定是Singleton的替代品,我更喜欢前者而不是后者。单身人士很难测试并导致紧密耦合。工厂,如果正确实施(使用纯接口等),会导致更多可测试的代码和更少的耦合。

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

答案 4 :(得分:1)

设计模式中描述的单身人士通常使用静态变量,这使得代码难以测试。

我建议您阅读MiškoHevery的this以及后续文章12。 在这里,他描述了具有单个实例的对象与设计模式中的Singleton对象之间的区别,并且第一个应该是首选。

所以你所描述的方法将成为我认为的方式。

答案 5 :(得分:1)

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