为什么工厂模式会这样工作?

2024-05-21

我从未真正研究过工厂模式,今天决定花时间根据本文创建一个快速示例(http://msdn.microsoft.com/en-us/library/ee817667.aspx http://msdn.microsoft.com/en-us/library/ee817667.aspx),终于让我明白了。

源代码完美地排列在三个独立的程序集中,整齐地命名为“产品”、“工厂”和“客户端”。

工厂模式的主要好处(据我所知)是从“Client”类中抽象出“product”类的实例化。因此,在提供的示例中,无论对产品类进行任何更改,产品实例化都不会更改,您仍然必须对客户端类进行更改以传递创建更新产品所需的新值。这些数据到底一定来自某个地方?

我读到的另一个例子指出,一旦实现了一个类并且其他类的负载直接使用它,对此处的“产品”类进行的更改将需要对该类的每个实例进行更改,例如,如果其构造函数中需要新变量。

据我所知,工厂模式确实确保此类的实例化永远不会改变,如果您想将新变量传递给产品构造函数,您最终只需将这些新变量传递给更新后的工厂即可。

因此,这显然并没有解决问题,而只是移动它,这样做会增加额外的复杂性。

鉴于这是一个既定的模式,我显然错过了一些东西。因此这篇文章:请向我解释我缺少什么。

Thanks


当您可以拥有同一接口的许多不同实现时,可以使用工厂,并且仅在运行时决定客户端实际需要哪一个。然而,客户端不需要知道它实际使用的是哪个实现。这就是工厂介入的地方:它封装了创建具体对象的细节,并将其作为所需接口的通用实现返回。

事实上,有两种不同的模式与 Factory 名称相关:抽象工厂 http://en.wikipedia.org/wiki/Abstract_factory_pattern and 工厂方法 http://en.wikipedia.org/wiki/Factory_method_pattern。后者用于创建单个产品的实例,而前者可用于创建整个相关产品系列。

抽象工厂的一个典型示例是在 GUI 框架中创建一系列小部件。框架的客户端可能只需要知道他们正在处理一个窗口、状态栏或按钮;然而,它们不必与实际小部件是 Windows 还是 MacOS 小部件这一事实联系在一起。这允许创建可以在这些平台中的任何一个上运行的客户端;理论上,当框架移植到新平台(例如 Linux)时,所需要做的就是实现一个新工厂来生成所有 Linux 特定的小部件,并通过配置将其插入。你瞧,客户端在 Linux 上运行,没有注意到任何差异,甚至可能不需要重新编译客户端代码(至少在理论上,在某些语言中 - 我知道关于多平台 GUI 的现实是不同的,但这只是一个例子 :-)

将此与尝试在没有工厂的情况下实现相同的方法进行比较:您将在客户端代码中的许多地方需要决定需要创建哪个特定于平台的小部件。每当您想要引入新的小部件系列时,您都需要修改代码中的每个位置,以向许多相同的小部件添加新分支switch or if/else块。此外,由于您将公开处理特定于平台的小部件对象,因此某些特定于平台的小部件特性和实现细节可能会泄漏到客户端代码中,从而使移植到其他平台变得更加困难。

无论对产品类进行任何更改,产品实例化都不会更改,您仍然需要对客户端类进行更改以传递创建更新产品所需的新值。这些数据到底一定来自某个地方?

的确。如果总体实例化过程发生变化,Factory接口也可能需要相应改变。这不是Factory的重点。尽管您可以在构建时将数据传递给工厂,然后每当创建新产品时工厂都可以在后台使用这些数据。

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

为什么工厂模式会这样工作? 的相关文章

  • Java中单例的其他方式[重复]

    这个问题在这里已经有答案了 只是我在考虑编写单例类的其他方法 那么这个类是否被认为是单例类呢 public class MyClass static Myclass myclass static myclass new MyClass pr
  • IoC 服务的抽象类还是接口?

    我目前正在使用 IoC 在项目中提供存储库的具体实现 我读过的所有示例都使用接口作为服务的定义 但是 在阅读了 Microsoft 的建议后 建议更喜欢抽象类而不是接口 http msdn microsoft com en us libra
  • java异常处理策略[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • MonoState、Singleton 或派生形式:CRUD 应用程序的最佳方法?

    我有一个相当大的 CRUD WinForm 应用程序 其中有许多对象 人员 注册 计划 案例注释等 该应用程序由 30 多种表单组成 UI 逻辑上被分解 会员 注册 计划 案例说明等 我正在尝试弄清楚如何创建我的人物对象搜索后搜索表格并将对
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 使用面向对象的分析和设计对电梯进行建模[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 当涉及到面向对象的设计和分析时 有一组问题似乎在面试和课堂上很常见 这是其中之一 不幸的是 我在大学的 OOP 教授从未真正给出过答案 所以我一
  • Struts ActionForm 属性应该是什么类型?

    我使用 Struts 1 2 4 继承了这个巨大的遗留 Java Web 应用程序 我有一个关于 ActionForms 的具体问题 其中一些仅具有字符串属性 即使对于数字 其中一些使用看似合适的类型 整数 日期 字符串等 这里的最佳实践是
  • 如何在Java中实现复合模式?

    我想实现一个复合模式Java以便绘制软件开发组织图 因此 我们假设有多个项目经理和多个开发人员 每个开发人员都被分配给一位项目经理 并且每个开发人员都能够使用各种编程语言进行编码 项目经理领导开发人员并准确了解他们的工作量 我对这个设计模式
  • Android:如何实现“分布式控制”

    对于与 Android 开发者论坛的交叉发帖表示歉意 那里没有收到任何答复 我有一个有趣的设计挑战 我有一个前端 Activity 和一个后端 用本机 C C 编写 代码 后端是一个复杂的对象 它部分控制 应用程序流程一旦启动就在它自己的线
  • Ruby 中实现的所有设计模式的备忘单?

    我想知道是否有针对 Ruby 中实现的所有设计模式的备忘单 这样您就不必重新发明轮子 设计模式对于组织大量代码非常有用 因为您不需要像在 verbose algol derivitive language 中那样编写那么多代码来在 ruby
  • tbb:并行查找第一个元素

    我遇到了这个问题 查找列表中满足给定条件的第一个元素 不幸的是 该列表相当长 100 000 个元素 并且使用单个线程评估每个元素的条件总共需要大约 30 秒 有没有办法干净地并行化这个问题 我浏览了所有tbb模式 但找不到任何合适的 UP
  • 如何在 Kotlin 中的数据类上实现空对象模式?

    我有一个 Kotlin 数据类 data class PaymentAccount val accountId Int val accountNumber String val title String 这就是我在 Java 中要做的事情
  • 领域驱动设计和工厂类的作用

    我不清楚工厂类的角色和职责是什么 我知道工厂类应该负责创建域对象 聚合根 及其关联的实体和值对象 但我不清楚 DDD 架构的工厂 层 在哪里 工厂应该直接调用存储库来获取其数据还是服务库 工厂在以下框架中的位置 UI gt 应用程序 gt
  • 池和集群之间的区别

    从最纯粹的角度来看 它们感觉像是相同的概念 两者都管理资源 节点集并控制来自外部组件或由外部组件进行的访问 通过池 您可以向池借用这些资源 节点 也可以从池中归还这些资源 节点 对于集群 您在资源 节点前面有一个负载均衡器 并且您可以向负载
  • 空对象模式以避免空检查?

    最近 我遇到了空对象设计模式 我的同事说它可以用来消除整个代码中遇到的空指针检查 例如 假设 DAO 类返回有关 Customer 的信息 在名为 CustomerVO 的值对象中 我的主类应该提取名字和电子邮件 ID 并向客户发送电子邮件
  • 工厂设计模式

    我正在尝试实现工厂设计模式 并且到目前为止已经做到了这一点 import abc class Button object metaclass abc ABCMeta html def get html self html return se
  • 使用存储库时,ASP.NET MVC 中业务逻辑的最佳位置是什么?

    在 ASP NET MVC 项目中实现数据库存储库时 将业务逻辑放入其中是否正确 或者将逻辑放入控制器类中可能更好 或者使用额外的服务和帮助程序类来操作数据 最终 除了其自己的层 作为 模型 层的一部分 之外 您的业务逻辑没有一个完美的位置
  • 根据维基百科,为什么“call super”被视为反模式? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用策略和工厂模式进行依赖注入

    我正在开展一个业余项目 以更好地理解控制反转和依赖注入以及不同的设计模式 我想知道是否有将 DI 与工厂和策略模式结合使用的最佳实践 当策略 从工厂构建 需要每个可能的构造函数和实现不同的参数时 我面临的挑战就出现了 因此 我发现自己在服务
  • 带双重检查锁的单例设计模式

    假设您有以下代码 1 为什么我们使用双重检查锁 为什么单锁不够好 请提供详细的例子 2 这种实施方式的主要缺点是什么 我该如何证明呢 Thanks public sealed class SomeSingleton5 private sta

随机推荐