design-patterns - 什么时候工厂方法比简单工厂更好,反之亦然?

标签 design-patterns oop

阅读 Head First Design Patterns 书。

我相信我了解简单工厂和工厂方法,但我无法看到工厂方法比简单工厂带来的优势。

如果一个对象 A 使用一个简单的工厂来创建它的 B 对象,那么客户端可以这样创建它:

A a = new A(new BFactory());

而如果一个对象使用工厂方法,客户端可以像这样创建它:
A a = new ConcreteA(); // ConcreteA contains a method for instantiating 
                       // the same Bs that the BFactory above creates, with 
                       // the method hardwired into the subclass of A, ConcreteA.

因此,在简单工厂的情况下,客户端将 A 与 B 工厂组合在一起,而使用工厂方法时,客户端会为所需的 B 类型选择适当的子类。

他们之间似乎没有太多选择。您必须选择要与哪个 BFactory 组合 A,或者您必须选择 A 的正确子类来为您提供 B。

在什么情况下一种优于另一种?

谢谢大家!

编辑:增加一点困惑IMO是Head First叙述中给出的解释,他们从简单的工厂过渡到工厂方法,说(第119页)“特许经营正在使用你的[简单]工厂来制作比萨饼,但开始在剩下的过程中使用他们自己的本土程序:他们烤的东西会有点不同……”他们有一张厨师的照片,他显然对他的比萨做了一些令人作呕的事情。

但是,使用一个简单的工厂让客户可以访问 bake() 方法或该过程的任何其他部分,这并没有什么意义。如果有任何问题,使用工厂方法也无济于事。

因此,在我看来,Head First 暗示在简单工厂上使用工厂方法的原因是虚假的。

最佳答案

分析不同角色的差异:A 的用户和 A 的提供者。这些模式对这些角色有不同的含义,随着时间的推移,这些含义很重要。

如果是

A myA = new SomeConcreteA()

A 的客户对 B 的存在一无所知。特定具体 A 的选择可能会受到某些文档的影响,即它使用特定 B 或 A 系列的某些完全其他特征。 A 的提供者负责创建具体 A 的所有风格,因此当 B 的种类发生变化时,他们可能有工作要做。

如果是
A myA = new A(myBFactory())

客户现在需要了解 B 及其工厂,并完全控制使用哪个工厂。提供者赋予了客户端更多的责任,我们可能增加了耦合——客户端代码现在显式地依赖于至少一个类。当新的 B 出现时,A 的提供者无事可做。

请注意,我们正在注入(inject) B 工厂,因此在编写客户端单元测试时,我们现在可以更轻松地为 B 提供模拟,因此测试客户端往往更容易。一般来说,我发现出于这个原因我更频繁地使用这种注入(inject)方法。

关于design-patterns - 什么时候工厂方法比简单工厂更好,反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3058623/

相关文章:

iphone - 具有Facebook Connect的iPhone应用程序的体系结构

database - 包含来自多个数据库的数据的域实体的推荐模式

ios - 实现MVC设计的难度(iOS游戏)

java - Java中的方法实现

java - Java 中的原型(prototype)模式——clone() 方法

java - 设计和对象责任的问题

c++ - C++ 中带有模板的装饰器模式

c - 无法在我的 C 代码中初始化回调。不兼容的引用类型导致未定义的行为

php - 在 Ajax 调用 PHP 文件中使用对象

java - 我不明白为什么这个递归不起作用