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

2024-01-12

我正在阅读《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。

在什么情况下一个比另一个更好?

谢谢大家!

编辑:在我看来,Head First 叙述中给出的解释增加了一点混乱,他们从简单工厂过渡到工厂方法,说(第 119 页)“特许经营店使用你的[简单]工厂来制作披萨,但开始在剩下的过程中采用他们自己的本土程序:他们烘烤的东西有点不同......”他们有一张厨师显然对他的披萨做了一些恶心的事情的照片。

但是,使用简单的工厂并不能让客户端访问 Baker() 方法或该过程的任何其他部分。如果出现任何问题,使用工厂方法没有任何帮助。

所以在我看来,Head First 暗示使用工厂方法而不是简单工厂的原因是假的。


分析不同角色的差异:A 的用户和 A 的提供者。这些模式对这些角色有不同的影响,随着事情随着时间的推移而变化,这些影响很重要。

如果是

A myA = new SomeConcreteA()

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

如果是

A myA = new A(myBFactory())

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么时候工厂方法比简单工厂更好,反之亦然? 的相关文章

  • 为什么我们需要将 delegate 设置为 self?为什么编译器不默认它?

    I think我完全理解授权的概念 我的问题是 当我们这样做时 class someViewController UIViewController UITableViewDelegate 会吗ever可能我们不想设置tableView de
  • 对多个属性使用一种设置方法 MATLAB

    我有几个属性基本上使用相同的属性set method classdef MyClass properties A B end methods function mc MyClass a b Constructor mc A a mc B b
  • 领域驱动设计示例(特别是 .NET 重点)

    好的 我已经订购了 但是当我等待它到达时 我正在考虑开始在我当前的项目中应用这些技术 我现在确实很好地掌握了这些概念 但是当我尝试应用它们时 我陷入了执行过程中 最终在各个项目中漏掉了我的职责 因此 我正在寻找可以引导我走向正确方向的资源
  • 存储库模式和 Linq to sql

    我正在尝试使用角色表 用户表和具有用户 ID 角色 ID 的外部参照表来实现用户身份验证和授权 为了实现通用存储库来更新角色 插入角色 添加用户 将用户添加到角色 更新用户 更新用户角色 验证用户 添加用户会话进行审核等 我是否需要为每个存
  • Smalltalk:消息的发送者是什么?

    在smalltalk中 一切都是通过向接收者对象发送消息来发生的 其语法通常遵循以下格式接收者消息 其中接收者是消息发送到的对象 现在我忍不住想知道 smalltalk 消息的发送者是什么 考虑以下smalltalk 语句 aMorph c
  • TypeScript 中 C# 类虚拟成员的等效项

    因此 在 C 中 当我创建模型类和延迟加载内容时 我会执行以下操作 public int User ID get set public int Dept ID get set 然后在我的班级稍远一点的地方 我像这样弹出我的虚拟 public
  • UML 帮助 C# 设计原则

    我在理解下面的 UML 时遇到问题 具体来说 两者之间有什么关系PersistentSet and ThirdPartyPersistentSet 之间有什么关系PersistentObject and ThirdPartyPersiste
  • 使 Web 表单输入在各种情况下安全的正确方法是什么?

    你们都认为什么是正确的 阅读 最灵活 松散耦合 最健壮等 方法来使来自 Web 的用户输入安全地用于 Web 应用程序的各个部分 显然 我们可以为每个上下文 数据库 屏幕显示 保存在磁盘上等 使用各自的清理功能 但是是否有一些通用的 模式
  • REST API 登录模式

    我正在创建一个 REST api 严格遵循 apigee 建议 使用名词而不是动词 将 api 版本烘焙到 URL 中 每个集合有两个 api 路径 GET POST PUT DELETE 用法等 我正在开发登录系统 但不确定登录用户的正确
  • 在VBA中使用类模块作为命名空间是否有任何陷阱

    VBA 不支持命名空间 Java 人员的包 其他语言中的命名空间有助于避免歧义并补充成员名称自动完成等工具 在 VBA 中模拟命名空间的一种方法是在类模块中声明什么是事实上的静态方法 然后在标准模块中声明该类的默认实例 这甚至是一些 Mic
  • F#:模式构成?

    我正在尝试编写一个由另外两个模式组成的模式 但我不确定如何去做 我的输入是字符串列表 文档 我有一个与文档标题匹配的模式和一个与文档正文匹配的模式 该模式应该匹配整个文档并返回标题和正文模式的结果 您可以使用以下命令一起运行两个模式 您在问
  • Java抽象类实现了一个接口,两者具有相同的方法

    在看一些OOP资料时 我想到了这个让我有点困惑的问题 考虑具有以下接口 抽象类和具体类 package one public interface A void doStuff package one public abstract clas
  • getter 和 setter 的目的? [复制]

    这个问题在这里已经有答案了 可能的重复 公共数据成员与 Getters Setters https stackoverflow com questions 2977007 public data members vs getters set
  • 如何在javascript中实现观察者模式?

    你好 我正在尝试在 JavaScript 中实现观察者模式 我的index js document ready function var ironMan new Movie ironMan setTitle IronMan ironMan
  • 如何从继承的方法中获取派生类的路径?

    如何从继承的方法中获取当前类的路径 我有以下内容 and
  • python编写的类爬虫抛出属性错误

    用 python 编写一些代码后 我陷入了深深的麻烦 我是按照 Python 中的 OOP 设计编写代码的新手 我在代码中使用的 xpath 是完美的 当通过 page crawler 类的实例运行 info grabber 类中的 pas
  • Java:getInstance 与静态

    目的是什么getInstance 在Java中 在我的研究过程中我一直在读getInstance 有助于实现单例设计模式 根据我的理解 这意味着整个程序中只有一个实例 但我不能只使用静态吗 这不是静态的全部意义吗 如果我只有静态方法和字段
  • 通过反思思考工厂设计模式

    我正在对工厂模式进行研发 我开发了下面的代码 现在我知道子类是 Dog 和 Cat 但是如果我想通过在 main 中传递类名来通过反射实现同样的事情 请告诉我该怎么做 爪哇 public abstract class Animal publ
  • 组织 jQuery/JavaScript 代码的最佳方式 (2013) [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 问题 这个答案之前已经回答过 但已经
  • 如何制作抗崩溃的ios应用程序

    我现在正在编写 ios 应用程序一段时间 但我的应用程序仍然经常崩溃 并且需要时间才能使它们变得非常稳定 我觉得这很烦人 那么 有没有关于防崩溃编程ios应用程序的编程模式呢 打开编译器警告 删除所有警告 运行静态分析器 删除所有警告 使用

随机推荐