- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
抱歉又问了。我在网上搜索过,但无法理解,因此我必须放在这里。这里是我自己研究的。我从 head first 设计模式开始学习。
抽象工厂模式:
根据我研究的差异,建筑商在某些方面感觉它是一家工厂,但是
大多数情况下,它只创建一种类型。
那么我可以说上图中的 NYStore 是构建器,因为它将披萨对象返回给客户端吗?
我对么?请根据上面的例子给出你的答案,这可能有助于我学习它。
最佳答案
有趣的。我建议对图表进行一些更改,使其符合 GoF 定义的经典 Builder 模式。
最大的不同在于,在构建器模式中,“主管”不知道构建器的细节。因此,与其有一个名为 NyPizzaStore
的类和一个名为 createPizza()
的方法(显然)高度调整以创建纽约风格的比萨饼,您可能会拥有一个类调用 PizzaChef
,它接受一个类的实例,该类自定义如何披萨做好了。 (对于此示例/类比,让我们将 rename PizzaIngerdientFactory
重命名为 Recipe
,以便我们可以稍微不同地对待它)。所以这给了你 PizzaChef.createPizza(Recipe r)
。 PizzaChef 类不需要担心蛤蜊是新鲜的还是冷冻的,他只需依次调用每个构建器并创建所需的比萨饼。这是差异的关键……只有一个 PizzaChef,他不知道食谱的细节(子类)。
这样做的一个很好的副作用是,您可以轻松地混合和匹配构成 Recipe 类的构建器,这样您就可以使用与 NYStyle 相同的所有成分构建器来创建 NewHavenStyle 比萨饼,但替换为 BrickFiredThinCrust
。更可定制。 Recipe
成为构建器实例的持有者。
当然,现在我饿了:)
注意不要混淆模式的名称(这是一种可重用的技术,几乎总是涉及多个对象/参与者/角色)和模式中特定角色的名称。此外,模式通常建立在彼此之上并且有很多重叠。
在 Builder 模式 中,有一个 Director
对象,它有一个 createSomething()
方法(不是调用它)。该方法将以一种非常公式化的方式调用一个或多个零件构建器。客户端有对 Director
的引用,并传入构建器。客户直接或间接地影响构建的内容。 Director 不需要是任何东西的子类,它可以是一个简单的密封类。 PizzaChef
不是客户而是导演。它不会从任何东西继承,也不会被继承。在这种情况下,客户端可能类似于 Customer
类。
现在,正如 Abstract Factory
模式建立在一组 Factory Methods
上(来自该名称的模式),您可以让 Builder
模式使用 Abstract Factory
。您可以将构建器作为 AbstractFactory 传递给 Director。在这种情况下,Recipe
将是您的 AbstractFactory,而 NyStyleRecipe
将继承 Recipe
并提供 PizzaChef
类将用于创建比萨饼的构建器方法。在这个特定的实现中,Directpr
模式的 Builder
确实是原始图中描述的客户端。
但正如我之前试图提到的,这并不是实现 Builder
模式的唯一必要条件,我认为它增加了 Builder 旨在克服的限制。我会改用可组合的 Recipe
类,因为这样您就可以更轻松地混合搭配成分。薄皮和纽约式披萨之间没有真正的联系。纽黑文风格也采用薄款。
Recipe newyorkStyle = new Recipe(
new ThinCrustBuilder(),
new RedSauceBuilder(),
new FreshClamsBuilder(),
new ElectricOvenBuilder());
Recipe newhavenStyle = new Recipe(
new ThinCrustBuilder(),
new WhiteSauceBuilder(),
new FreshClamsBuilder(),
new BrickOvenBuilder());
PizzaChef chef = new PizzaChef ();
nyPizza = checf.createPizza(newyorkStyle);
nhPizza = checf.createPizza(newhavenStyle);
Abstract Factory
这不会那么容易
关于design-patterns - 抽象工厂和构建器之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24696828/
我应该执行以下操作: 可能通过服务/工厂,使用 $q(异步)查询 API 以获取大型名称数据集 有另一个服务(也是异步的),它应该只返回上述工厂的元素,如果它们与某个字符串(搜索字段)匹配。目的是缩小
我有一个通用的基类。我有一个实现基类的具体类。 我将如何创建工厂类/方法来交付不同类型的具体类? 举个例子: public class ReceiverBase where T : IInte
我正在查看以下链接中的 Ninject Factory 扩展: http://www.planetgeek.ch/2011/12/31/ninject-extensions-factory-intro
工厂、提供商和服务这三个术语之间有什么区别? 刚刚了解 NHibernate 及其存储库模式(POCO 类等)。 最佳答案 工厂:通过将一堆位组合在一起或基于某种上下文选择类型来组装类 Provide
使用CGLIB我可以做到 final var enhancer = new Enhancer(); enhancer.setUseCache(false); enhancer.setSuperclas
我试图在 Kotlin 中使用伴随对象工厂方法(相当于 Java 中的静态工厂方法)创建一个嵌套内部类。这是我的代码的简化版本。 class OuterClass { var myData:L
我正在为我的大学做一个项目,但遇到了问题。 基本上,该项目由一个客户端-服务器应用程序组成,我想创建一个用于通信的 Packet 类。数据包由 header 和主体组成。现在问题来了。我可以有一些不同
这个问题在这里已经有了答案: Why doesn't polymorphism work without pointers/references? (6 个答案) What is object sl
我正在制作一个套接字工厂。我希望每个外部应用程序都使用 Socket 类的接口(interface),它是几个类(ServerSocketTCP、ClientSocketTCP、ServerSocke
我是 angularjs 的新手,我正在尝试创建一个小型电影数据库。这是我第一次使用工厂,我想确保这是正确的方法,以及如何在另一个功能中使用这个工厂,如下所示? 我希望这个工厂只运行一次,这样我就可以
这个问题在这里已经有了答案: Java inner class and static nested class (28 个答案) 关闭 5 年前。 public class DataFactory
我看过很多关于 C++ 工厂的帖子,但到目前为止我还没有看到解决我的问题的解决方案。 (虽然我可能遗漏了一些东西。) 示例控制台应用程序: #include #include #include
这是一个简单的 C++ 项目,有 2 种设计模式:单例和工厂,sigleton 也是一个模板化类,一个接口(interface) (IHash) 和一个类 (Hash1)。一个简单的工厂类 (Hash
这个问题类似于Factory and generics ,并且可能有相同的答案,但它是不同的。我有一个通用基类,它将由完全独立的 JAR 中的类进行扩展。所述 JAR 应该能够在不更改任何其他代码的情
问题是我需要为传递的类创建一个新实例 有没有办法重写这个函数,让它可以接受任意数量的参数? function createInstance(ofClass, arg1, arg2, arg3, ...
我想用简单的 C++ 语法创建一个简单的工厂方法: void *createObject(const char *str,...) { if(!strcmp("X",str)) retu
经过大约 10 个月的程序化 PHP 学习后,我现在正尝试着手研究基本的 OOP 原则和设计模式。这是一个爱好,我没有那么多时间去追求它,所以请原谅这个问题的水平很低。 我的网站(目前 100% 程序
我有一个简单的问题。 我如何编写一个工厂来定义使用 make() 或 create() 的关系,具体取决于原始调用 make() 还是 create()? 这是我的用例: 我有一个简单的工厂 /**
我正在尝试在延迟加载模块中提供 APP_BASE_HREF 注入(inject) token ,然而,工厂方法根本没有被调用。 在这里https://github.com/MaurizioCascia
我有以下 ast: import { factory as f } from 'typescript' const typeDeclaration = f.createTypeAliasDeclara
我是一名优秀的程序员,十分优秀!