何时使用抽象工厂模式?

时间:2010-12-02 02:41:49

标签: oop design-patterns language-agnostic factory factory-pattern

我正在尝试简洁地描述何时使用工厂,我和我的团队。我遇到了以下相关问题,这有点帮助:

基于这些链接和其他一些来源(在下面列出),我想出了以下内容:

何时使用抽象工厂模式:

  • 使用接口var或'new'运算符时
    • e.g。 User user = new ConcreteUserImpl();
  • 并且您正在编写的代码在某些时候应该是可测试/可扩展的

解释

  • 接口本质上意味着多个实现(适用于单元测试)
  • 接口变量意味着符合OCP和LSP的代码(支持子分类)
  • 使用'new'运算符会破坏OCP / DI,因为高度耦合的类很难测试或更改

“我是否为每种对象类型创建工厂?这看起来过分了。”

  • 不,你可以有一个(或几个)工厂生产很多(通常是相关的)对象类型
  • e.g。 appFactory.createUser(); appFactory.createCatalog();等。

何时不使用工厂:

  • 新对象非常简单,不太可能被分类
    • e.g。 List list = new ArrayList();
  • 测试新对象并不感兴趣
    • 没有依赖
    • 不执行任何相关或长期工作
    • e.g。 Logger log = new SimpleLogger();

参考文献:


我的问题是:我的摘要是否准确,是否有意义?有什么我忽略的吗?

提前致谢。

3 个答案:

答案 0 :(得分:5)

我还说当你有一个你想要的特定实现时,不要使用工厂。要继续List示例,我知道我想要ArrayList,因为我正在进行随机访问。当我能够自己做的时候,我不想依靠工厂做到这一点。

相反,当我不想知道具体的子类时,我可以使用工厂,让它担心实际实例化哪个对象。

我想我建议你在“什么时候使用抽象工厂模式”中添加一个子弹,上面写着“你并不真正关心你得到的具体子类”,并且反对“何时不去使用工厂“。

编辑:小心避开general-purpose tool-building factory factory factory

答案 1 :(得分:3)

通常,当您希望能够通过外部配置切换实现时使用它。

JDBC和JAXP就是很好的例子。有关更多示例,请查看this answer

答案 2 :(得分:1)

抽象工厂模式提供了一种封装具有相互共享性的具体工厂的方法,这意味着它们实现了相同的接口/抽象类。

每当您想要控制对象的初始化时,您需要使用工厂模式,而不是将控件提供给使用者。