我试图简要描述何时使用工厂,为了让我和我的团队都能明白。我看到了以下相关问题,有所帮助:
- 何时使用工厂模式?
- (有用的pdf链接已损坏)
- 如何创建您的工厂?
- (更多是“如何”,而不是“何时”)
- 您使用工厂而不是构造函数创建对象的门槛是多少?
- (一些通用答案)
- 工厂模式。何时使用工厂方法?
- (更多关于工厂方法而不是工厂类)
- 何时使用工厂方法模式?
- (同样更多关于工厂方法)
基于这些链接和其他一些来源(列在底部),我总结出以下内容:
何时使用抽象工厂模式:
- 当您使用接口变量或“new”运算符
- 例如:User user = new ConcreteUserImpl();
- 并且您编写的代码应该在某个时刻可测试/可扩展。
解释:
- 接口本质上意味着多个实现(有利于单元测试)
- 接口变量意味着OCP和LSP兼容的代码(支持子类化)
"我是否需要为每种对象类型创建一个工厂?那似乎有些过分了。"
- 不需要,您可以拥有一个(或几个)工厂来生产许多(通常是相关的)对象类型
- 例如:appFactory.createUser(); appFactory.createCatalog();等等。
不适用工厂的情况:
- 新对象非常简单且不太可能被子类化
- 例如:List list = new ArrayList();
- 新对象对测试不感兴趣
- 没有依赖项
- 没有执行任何相关或长时间运行的工作
- 例如:Logger 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
我的问题是:我的总结准确吗?有没有我忽略的内容?
提前致谢。