oop - 何时使用抽象工厂模式?

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

我试图简洁地描述为我自己和我的团队使用工厂。我遇到了以下相关问题,这在一定程度上有所帮助:

  • When to use factory patterns?
  • (有用的 pdf 链接已损坏)
  • How do you create your Factories?
  • (更多的是“如何”而不是“何时”)
  • What is your threshold to use factory instead of a constructor to create an object?
  • (一些一般性答案)
  • Factory Pattern. When to use factory methods?
  • (更多关于工厂方法而不是工厂类)
  • When to use Factory method pattern?
  • (再次详细了解工厂方法)

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

    何时使用抽象工厂模式:
  • 当您使用接口(interface) var 或"new"运算符时
  • 例如用户用户 = 新的 ConcreteUserImpl();
  • 并且您正在编写的代码在某些时候应该是可测试/可扩展的

  • 解释:
  • 接口(interface)本质上意味着多种实现(有利于单元测试)
  • 接口(interface)变量暗示符合 OCP 和 LSP 的代码(支持子类化)
  • 使用“new”操作符会破坏 OCP/DI,因为高度耦合的类很难测试或更改

  • “我是否为每种对象类型都创建了一个工厂?这似乎太过分了。”
  • 不,您可以拥有一个(或几个)工厂来生产很多(通常是相关的)对象类型
  • 例如appFactory.createUser(); appFactory.createCatalog();等

  • 何时不使用工厂:
  • 新对象非常简单,不太可能被子分类
  • 例如列表列表 = 新的 ArrayList();
  • 新对象对测试不感兴趣
  • 没有依赖关系
  • 不执行任何相关或长期运行的工作
  • 例如记录器 log = new SimpleLogger();

  • 引用文献:
  • http://googletesting.blogspot.com/2008/08/where-have-all-singletons-gone.html
  • http://misko.hevery.com/2008/07/08/how-to-think-about-the-new-operator/
  • http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/
  • http://en.wikipedia.org/wiki/Dependency_Injection
  • http://en.wikipedia.org/wiki/Open_Closed_Principle
  • http://en.wikipedia.org/wiki/Liskov_substitution_principle


  • 我的问题是:我的总结是否准确,是否有意义?有什么我忽略的吗?

    提前致谢。

    最佳答案

    我还要说当你有你想要的特定实现时不要使用工厂。继续List例如,我知道我想要一个 ArrayList因为我在做随机访问。当我自己能做到的时候,我不想依赖工厂把这件事做好。

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

    我想我建议您在“何时使用抽象工厂模式”中添加一个项目符号,上面写着“并且您并不真正关心您获得哪个具体子类”,而与“何时不使用工厂模式”相反”。

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

    关于oop - 何时使用抽象工厂模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4331199/

    相关文章:

    java - 需要帮助推断 Java 代码

    PHP OOP 入门

    C++ 设计模式 : multiple ways to load file

    iphone - 由于 NSManagedObjectContext 保存而更新 NSFetchedResultsController 时延迟 UITableView 更新

    用于强制执行类先决条件的 java 设计模式

    language-agnostic - 什么是 lambda ?

    algorithm - 与归并排序相比,快速排序在缓存局部性方面有何优势?

    c# - 您希望设计架构具备哪些品质,以便编码团队可以轻松实现?

    ruby - 常量与按需实例化的对象——哪个最优?

    language-agnostic - 许可证是否与小代码片段相关?