gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:37:40 29 4
gpt4 key购买 nike

阅读 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com