【问题标题】:Overuse of factory pattern过度使用工厂模式
【发布时间】:2026-02-19 09:50:02
【问题描述】:

我在哪里不应该使用工厂模式,因为我周围的每个人都告诉我不要实例化具体的对象。工厂在测试时不容易处理,我不想为我创建的每个可能的对象创建工厂。 除了所有这些混乱之外,为什么我需要有单例工厂?

【问题讨论】:

  • 也许我只是在吹毛求疵...但在某个地方、某个时间、不知何故,您确实必须实例化一个具体的对象。如果你不这样做,你将没有任何对象可以使用。问题是您在哪里、何时以及如何做。
  • 哦,你不需要单例。时期。你想谈论可测试性……那几乎就是把它扼杀了。
  • 是的,我也知道,但我不知道人们为什么使用它?使用它的目的是什么
  • 单身?这很容易理解,它让全球快乐的人们感觉他们正在正确地设计东西,因为嘿,它在 GoF 书中!。 (大错特错,IMO。)另外,他们可能对依赖注入一无所知。

标签: design-patterns factory


【解决方案1】:

您应该针对接口进行编程,对所有事情都使用工厂模式是疯狂的。

单例可能很有用,但只有在需要/想要的时候才会再次使用。

主要是不要使用你不理解或不明白的东西,值得一读Martin Fowlers的书然后再考虑一下,你可能会得出适合你的中间道路。

在编程中没有对错取决于许多因素。即使对所有事情都使用界面可能会很痛苦,但它总是为我付出代价。

【讨论】:

    【解决方案2】:

    接口类型是协议的规范,可能被许多对象类型支持。尽可能使用base classes 而不是接口。从版本控制的角度来看,类比接口更灵活。使用一个类,您可以发布 1.0 版,然后在 2.0 版中向该类添加一个新方法。只要方法不是抽象的,任何现有的派生类都将继续发挥作用。

    例如,为数据适配器提供接口很困难,而且没有真正的好处。开发人员仍然必须针对每个适配器专门进行编程,因此提供接口只能带来边际收益。但是,您确实需要支持所有适配器之间的一致性。尽管接口或抽象类在这种情况下并不合适,但提供一致的模式非常重要。您可以在基类中为开发人员提供一致的模式。请遵循这些准则来创建基类。

    接口适用于以下情况:

    • 几个不相关的类想要支持该协议。

    • 这些类已经建立了基类(例如,有些是用户界面 (UI) 控件,有些是 XML Web 服务)。

    • 聚合不合适或不实用。

    在所有其他情况下,类继承是更好的模型。

    【讨论】: