已经有一些关于Singleton-Pattern的帖子了,但是我想在这个主题上再开一个,因为我想知道Factory-Pattern是否是正确的方法来删除这个“反模式” ”
在过去,我使用了单身人士,也是我的同事,因为它很容易使用。例如,Eclipse IDE或更好的工作台模型也会大量使用单例。这是由于一些关于E4(下一个大型Eclipse版本)的帖子让我开始重新思考单身人士。
最重要的是,由于这些单身人士,Eclipse 3.x中的家属紧密耦合。
让我们假设我想完全摆脱所有单身人士,而是使用工厂。
我的想法如下:
这有意义吗? 如果没有,请说明您为什么这么认为的原因。另一种解决方案也值得赞赏。
由于
马克
答案 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以及后续文章1和2。 在这里,他描述了具有单个实例的对象与设计模式中的Singleton对象之间的区别,并且第一个应该是首选。
所以你所描述的方法将成为我认为的方式。
答案 5 :(得分:1)
Singleton当然是反模式。如果你正在使用TDD - 你应该避免这样的解决方案。任何IoC框架(如Windsor或Unity)都可以为您模拟此功能,而无需可怕的静态类。但是,如果您不使用TDD并且您的项目非常简单,则可以使用它。顺便说一下,我推荐IoC Framework而不是自制工厂。不发明轮子。