何时使用抽象工厂模式?

Luk*_*uke 18 language-agnostic oop design-patterns factory factory-pattern

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

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

何时使用抽象工厂模式:

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

说明:

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

"我是否为每种对象类型创建了一个工厂?这看起来过分了."

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

何时不使用工厂:

  • 新对象非常简单,不太可能被细分
    • 例如List list = new ArrayList();
  • 新对象测试不是很有趣
    • 没有依赖关系
    • 不执行任何相关或长期工作
    • 例如Logger log = new SimpleLogger();

参考文献:


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

提前致谢.

Cam*_*ner 5

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

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

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

编辑:小心避开通用工具厂工厂工厂.


dex*_*ter 1

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

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