抽象工厂模式是否有“更多”的现实世界示例? [关闭]

2024-02-15

我目前正在研究OPP的设计模式。只是为了给您一些背景知识。这不是我第一次遇到这些模式。我已经编程了一段时间(十年左右),并且非常熟悉许多编程原理,尤其是 SOLID。我主要从事网络应用程序开发,所以也许我错过了一些可以在不同编程领域学到的东西。

正如标题所示,我正在努力深入掌握抽象工厂模式。我确实理解定义以及“何时使用模式”部分,但我仍然没有抓住重点。特别是当将 SOLID 的开闭原理添加到方程中时。

我是什么意思?

上图取自 GOF 的《设计模式》一书。

为了使这篇文章真正成为一个问题,有两件事我自己找不到答案:

  1. 当你学习开放封闭原则时,你会发现类应该保持封闭状态以进行修改。它导致的实现类似于策略模式。当您查看 AbstractFactory 的方法结构时,它会列出它创建的所有产品作为单独的方法。这意味着当我们想要向系列中添加新产品时,我们需要修改 AbstractFactory 并创建新方法。这不是违反了开闭原则吗?也许没有更好的方法来做到这一点,不是吗?

  2. 其次,除了书中使用的例子(WidgetFactory - GOF,PizzaStore - HeadFirst)之外,任何人都可以为我提供一些现实世界的例子吗?您是否有任何常见的实现可以让您说“是的,这是我通常使用抽象工厂实现的东西”?抽象工厂什么时候真正有用?或者我是否很好地理解了该模式,但它在 Web 开发中并不常见?

我希望我能以某种方式表达我对这种模式的不确定性。无论如何,请随时提出后续问题,我很乐意提供更多详细信息。

先感谢您!

Dan


[OCP] 的实现结果类似于策略模式。

可能吧。有多种方法可以实现 OCP。伯特兰·迈耶(Bertrand Meyer)最初在定义这一原则时大力宣扬继承。

...当我们想要向系列中添加新产品时,我们需要修改抽象工厂并创建新方法。这不是违规吗...

可能吧。这取决于你如何实现该模式,但 GoF 书在第 90 页确实承认了这个问题。

支持新产品很困难。将抽象工厂扩展到 生产新品种的产品并不容易。那是因为 AbstractFactory 界面修复了可以创建的产品集。支持新品种 产品需要扩展工厂接口,这涉及到更改 AbstractFactory 类及其所有子类。我们讨论一种解决方案 这个问题在实现部分。

GoF书中提到的解决方案是对Abstract Factory方法进行参数化,这会导致其自身的一系列问题。

...这在 Web 开发中并不常见?

不,这不对。在编写 GoF 书时,依赖注入还不是常见的模式,但如今它几乎取代了对抽象工厂的需求。今天,我几乎愿意将抽象工厂称为反模式。但我仍然持开放态度,认为可能存在比 DI 更适合 AF 的问题。我只是还没有看到一个。

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

抽象工厂模式是否有“更多”的现实世界示例? [关闭] 的相关文章

  • std:: 对象/指针/智能指针的向量传递对象(总线错误:10)?

    我想询问一般建议 下面的代码完全编译并大致代表了我处理的代码的结构 简而言之 我想将从一个地方传递一系列从基类 Class1 派生的对象和一些其他参数到另一个地方 更准确地说 实现父类的不同子类 收集这些子类的实例并传递参数进行处理 问题是
  • 工厂设计模式

    我正在尝试实现工厂设计模式 并且到目前为止已经做到了这一点 import abc class Button object metaclass abc ABCMeta html def get html self html return se
  • 为什么Perl的SUPER调用不使用箭头方法?

    我注意到 当您调用超类的方法时 您需要执行以下操作 my self class gt SUPER new 为什么不是这样 my self class gt SUPER gt new 我怀疑是因为 class gt SUPER gt new
  • 如何通过继承在Python中子类化请求

    我想专门化 子类化请求包以添加一些具有自定义功能的方法 我尝试这样做 concrete requests py import requests class concreteRequests requests def init self su
  • 使用字符串选择对象属性

    我正在编写的 C 程序遇到了一些问题 如果有人能提供帮助那就太好了 背景是这样的 并不是非常重要 但这就是为什么我需要弄清楚如何做到这一点 我正在使用数据库的 Web 服务来检索有关数据库中条目的信息 对数据库的每次访问都会返回一个具有许多
  • 全局常量是反模式吗?

    我一直认为仅仅为了保持常量而创建一个类是一个糟糕的设计 但最近 我尝试用谷歌搜索它 发现只有一个界面作为常量是不好的反模式 没有提到使用一类常量 我认为 由于常量类实际上与全局变量没有太大区别 这就是我反对它并倾向于重构此类类的原因 它创建
  • 这是重载,不同类中具有相同名称和不同签名的方法吗?

    如果我有以下 Java 代码 class A public int add int a int b return a b class B extends A public float add float a float b return a
  • 将状态上下文作为附加方法参数嵌入到状态中有何优缺点?

    在设计模式的背景下state 嵌入的优点和缺点是什么StateContext作为附加方法参数State 为了更清楚地说明 public void handle Object obj vs public void handle StateCo
  • 如何制作抗崩溃的ios应用程序

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

    Martin Fowler 认为贫血领域模型是一种反模式 将持久性模型作为域模型进行滚动似乎也严重偏离 因为对象关系阻抗不匹配 http en wikipedia org wiki Object Relational impedance m
  • OOP JavaScript - 创建自定义 Div 对象

    我刚刚开始使用 JavaScript 进行 OOP 我想创建一个自定义 面板 这是我到目前为止所拥有的 function ShinyPanel css attributes this container document createEle
  • 如果我们在实体类的getter和setter中添加逻辑是不是不好的设计

    JAVA 8 我有一个 POJO 类 class User private String name private String password Getters Setters 我将使用它作为实体类 在 getter setter 中pa
  • 用于将 cython 中的许多 C++ 类包装到单个共享对象的项目结构

    我在文档 邮件列表和这个问题在这里 https stackoverflow com questions 10300660 cython and distutils 但我想得到一个更直接的答案来解决我的具体情况 我正在通过尝试一点一点地包装我
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • PHP 中的 -> 和 :: 有什么区别?

    这个东西困扰我好久了 一直找不到 在 php 中使用 和 gt 之间的类有什么区别 让我举个例子 想象一个名为 MyClass 的类 该类中有一个函数 myFunction 使用有什么区别 MyClass myclass new MyCla
  • 我们可以实例化一个抽象类吗?

    在一次采访中 有人问我 我们是否可以实例化一个抽象类 我的回答是 不 我们不能 但是 面试官告诉我 错了 我们可以 我对此争论了一下 然后他告诉我自己在家尝试一下 abstract class my public void mymethod
  • Microsoft 的并行模式库:有人想知道移植到 POSIX / Linux 有多困难吗?

    该书已出版 http blogs msdn com b vcblog archive 2011 03 15 10139453 aspx http blogs msdn com b vcblog archive 2011 03 15 1013
  • 如何在不使用 viewWillDisappear 的情况下使 NSTimer 无效/取消初始化?

    var faderTimer NSTimer override func viewDidLoad super viewDidLoad self faderTimer NSTimer scheduledTimerWithTimeInterva
  • 设计模式和库有什么区别?

    设计模式和库有什么区别 我似乎找不到任何地方的区别 DesingPatterns 被认为是通过解决已知问题来帮助开发人员 例如 ObserverPattern 用于观察concreate 对象并执行特定操作 mediator 用于集中应用程
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu

随机推荐

  • 如何从 Firebase 中的实时数据库获取数据

    我已使用实时数据库进行此设置 gt users gt uid gt name gt email gt other info 如果我想保存用户数据 我将使用我的 User 类 然后在数据库中设置对象 如下所示 assume variables
  • 如何:javascript 淡入淡出文本

    首先 我浏览了 stackoverflow 上的其他帖子 但没有一个包含我正在寻找的信息 第二 我是编程新手 我想在我的网站上有一个淡入和淡出文本的 div 我在一些网站上看到过这个 我很确定它是使用 jQuery 库的 javaScrip
  • 找到列表中的所有山丘和山谷

    我正在编写一个函数来查找给定列表中的所有山丘和山谷 例如 1 0 0 0 1 返回 3 0 1 0 1 0 返回 5 0 2 2 1 1 0 0 返回 3 如果一个数字 或具有相同值的连续数字 比它的两个邻居都大或小 它被认为是一座山或一座
  • “未处理的 JS 异常:类型错误”

    我刚刚重置了 iPhone 模拟器的设置 通过点击 重置内容和设置 现在我遇到了以前从未遇到过的问题 这里是 我坚持认为该项目在重置之前完美运行 但我需要清除应用程序的本地存储 当人们更改位置时 我确实看到了一些帖子index ios js
  • gvisScatterChart 动态定义系列

    我正在动态创建几个gvisScatterCharts 我想定义每条线的颜色 我可以使用系列和颜色属性来完成 没有什么比订单或固定数字更能让我预先定义颜色的了 所以我想创建一个与我的颜色平行的属性数组 并将其放在series myColors
  • 如何启用格式化的 Xdebug 错误和跟踪

    我不确定我何时或更改了什么 但突然 xdebug 不再呈现其格式化的堆栈跟踪 相反 它在没有任何 HTML 的情况下呈现 stacktrtace 这是一个例子 http berkes openphoto me photo l view 而我
  • 模型继承和属性默认值

    我有一个带有类别属性和几个子类的主类 我想为每个子类设置默认类别 例如 class BaseAd models Model CATEGORY CHOICES 1 Zeta 2 Sigma 3 Omega category models In
  • 无法在准备好的 INSERT 语句中使用 python mysql.connector 中的 None (NULL) 值

    当尝试使用准备好的光标并插入时NULL重视mysql 连接器报错 mysql Error 1210 HY000 Incorrect arguments to mysqld stmt execute 这是准确显示这一点的代码 from fut
  • 如何在mysql的列之间进行搜索

    我有两列存储值 数字 如何选择给定数字在两列中的值之间的位置 例子 id col1 col2 1 20 50 2 200 400 3 500 650 如果我的值为 25 我如何选择值 25 位于它们之间的记录 在本例中为第 1 行 sele
  • C 或 C++ 中 >>= 的含义是什么?

    的含义是什么 gt gt C 或 C 中的符号 它有什么特别的名字吗 我有这个for循环一些 CUDA 代码 如下所示 for int offset blockDim x offset gt 0 offset gt gt 1 Some co
  • Numpy 将布尔数组的字符串表示形式转换为布尔数组

    是否有一种原生的 numpy 方法来转换布尔值的字符串表示数组 例如 True False True False 对于我可以用于屏蔽 索引的实际布尔数组 我可以做一个 for 循环来遍历并重建数组 但对于大型数组来说 这很慢 您应该能够进行
  • 验证插件未验证所有字段

    我正在使用 jQuery 验证插件进行表单验证 它只是检查第一个字段 如果第一个字段验证为真 则正在提交表单 它不验证其余字段 我正在使用引导程序3 0
  • 输入语句块时会创建新的堆栈帧吗? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 语言中 大括号充当堆栈框架吗 https stackoverflow com questions 2759371 in c do braces act as a stack frame int
  • Selenium:如何点击javascript按钮

    我必须编写一些用于自动测试的脚本 以检查使用 flex amf 技术构建的 Web 应用程序的加载时间 测试将包括打开 IE 浏览器 浏览多个选项卡 并测量从单击最后一个选项卡加载页面内容到关闭浏览器的时间 我使用 Selenium Web
  • RavenDB 索引错误

    我刚刚开始使用 Raven 我创建的索引始终无法索引任何内容 我在 Raven 服务器上发现了很多如下所示的错误 Index HomeBlurb IncludeTotalCosts Error Cannot implicitly conve
  • VB.NET 尝试将通用 Invoke 方法修改为通用 BeginInvoke 方法,出现意外问题

    VB NET 2010 NET 4 Hello 我一直在使用一种非常灵活的通用调用方法来从后台线程更新 UI 我忘记了从哪里复制它 从 C 将其转换为 VB NET 但它是 Public Sub InvokeControl Of T As
  • Reflection.Emit 和泛型类型

    我在用Reflection Emit我想创建一个与 C 中定义的以下类型等效的类型 class A public Tuple
  • 如何在 Mercurial 中添加远程存储库?

    我通过以下方式使用 Git 存储库 我在不同的生产机器上有主存储库和几个遥控器 我将生产代码推送到远程并重新启动服务以使更改生效 我即将从 Git 切换到 Mercurial 我想提前知道如何实现类似的目标 您将条目添加到 paths 本地
  • 优雅地从 has_many 中选择属性:通过 Rails 中的连接模型

    我想知道从 has many 中的连接模型选择属性的最简单 最优雅的方法是什么 通过关联 假设我们有具有以下 Item 类的 Items Catalogs 和 CatalogItems class Item lt ActiveRecord
  • 抽象工厂模式是否有“更多”的现实世界示例? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我目前正在研究OPP的设计模式 只是为了给您一些背景知识 这不是我第一次遇到这些模式 我已经编程了一段时