【发布时间】:2011-05-18 21:18:43
【问题描述】:
我试图简明扼要地描述何时为我自己和我的团队使用工厂。我遇到了以下相关问题,这在一定程度上有所帮助:
-
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?
- (再次详细了解工厂方法)
根据这些链接和一堆其他来源(列在底部),我想出了以下内容:
何时使用抽象工厂模式:
- 当您使用接口 var 或“新”运算符时
- 例如用户用户 = 新的 ConcreteUserImpl();
- 并且您正在编写的代码在某些时候应该是可测试/可扩展的
说明:
- 接口本质上意味着多种实现(有利于单元测试)
- 接口变量暗示符合 OCP 和 LSP 的代码(支持子类化)
- 使用“new”运算符会破坏 OCP/DI,因为高度耦合的类很难测试或更改
“我是否为每种对象类型都创建了一个工厂?这似乎太过分了。”
- 不,您可以拥有一个(或几个)工厂来生产很多(通常是相关的)对象类型
- 例如appFactory.createUser(); appFactory.createCatalog();等等。
何时不使用工厂:
- 新对象非常简单,不太可能被子分类
- 例如List list = new 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
我的问题是:我的总结是否准确,是否有意义?有什么我忽略的吗?
提前致谢。
【问题讨论】:
-
我讨厌恢复旧线程,但是...我不同意记录器应该像上面那样是新的。我经常在不同的测试环境中运行不同的记录器。我将环境配置为使用特定的记录器并将其注入到记录的对象中。 (我什至可以注入记录器数组。)
标签: oop design-patterns language-agnostic factory factory-pattern