Design patterns 抽象工厂和建设者的区别?

Design patterns 抽象工厂和建设者的区别?,design-patterns,builder,abstract-factory,Design Patterns,Builder,Abstract Factory,很抱歉再次询问。我在网上搜索过,但无法理解,因此我不得不把它放在这里。这是我自己研究的。我从头先设计模式开始学习 抽象工厂模式: 根据差异,我研究了建筑商的一些感觉,这是一个工厂,但 大多数情况下,它只创建一种类型。 所以我可以说上图中的NYStore是builder,因为它将pizza对象返回给客户端? 我说得对吗?请根据上述示例给出答案,这可能有助于我学习。生成器和抽象工厂模式的相似之处在于,它们都从抽象的角度看待构造。然而,构建器模式关注的是 单个对象由不同的工厂组成,而抽象工厂模式 与

很抱歉再次询问。我在网上搜索过,但无法理解,因此我不得不把它放在这里。这是我自己研究的。我从头先设计模式开始学习

抽象工厂模式:

根据差异,我研究了建筑商的一些感觉,这是一个工厂,但 大多数情况下,它只创建一种类型。
所以我可以说上图中的NYStore是builder,因为它将pizza对象返回给客户端?
我说得对吗?请根据上述示例给出答案,这可能有助于我学习。

生成器和抽象工厂模式的相似之处在于,它们都从抽象的角度看待构造。然而,构建器模式关注的是 单个对象由不同的工厂组成,而抽象工厂模式 与生产什么产品有关。生成器模式抽象了 通过包含一个控制器的概念来构造算法。导演是 负责逐项列出步骤,并要求建设者完成这些步骤。董事会 不必遵循接口

其他的例子(你的除外)可能是创建产品而不是客户 显式声明ProductA和ProductB类型的字段,例如,产品对象 生成器返回实际上是一个零件列表,可以具有不同的长度和内容
这取决于负责其创建的导演。

有趣。我建议对图表进行一些修改,使其符合GoF定义的经典构建器模式

最大的区别在于,在构建器模式中,“主管”不知道构建器的细节。因此,与其使用名为
nypazastore
的类和名为
createPizza()
的方法(显然)来创建一个纽约风格的比萨饼,不如使用名为
PizzaChef
的类,该类接受一个自定义比萨饼制作细节的类的实例。(对于这个示例/类比,让我们将
PizzaIngerdientFactory
重命名为
Recipe
,这样我们可以稍微不同地对待它)。因此,这将为您提供
PizzaChef.createPizza(配方r)
。PizzaChef课程不需要担心蛤蜊是新鲜的还是冷冻的,他只需依次给每个建设者打电话,就可以制作出想要的比萨。这是关键的区别…只有一个比萨厨师,他不知道配方的细节(子类)

这一点的一个好的副作用是,您可以轻松地混合和匹配构成配方类的构建人员,这样您可以使用与NYStyle相同的所有成分生成器创建NewHaventyle比萨饼,但换成
brickfiedthinsecast
来替换。更可定制<代码>配方成为生成器实例的持有者

当然,现在我饿了:)


注意不要混淆模式的名称(这是一种可重用的技术,几乎总是涉及多个对象/参与者/角色)和模式中特定角色的名称。此外,模式通常是建立在彼此之上的,并且有很多重叠

在生成器模式中有一个
Director
对象,该对象将有一个
createSomething()
方法(不调用它)。该方法将以非常公式化的方式调用一个或多个部件生成器。客户引用了
主管
,并传入了生成器。客户直接或间接地影响所构建的内容。Director不需要是任何东西的子类,它可以是一个简单的、密封的类
PizzaChef
不是客户,而是主管。它不会继承任何东西,也不会被继承。本例中的客户机可能类似于
Customer

现在,正如
抽象工厂
模式是基于一组
工厂方法
(来自该名称的模式)构建的一样,您可以让
生成器
模式利用
抽象工厂
。你可以把建筑工人作为抽象工厂交给厂长。在这种情况下,
Recipe
将是您的抽象工厂,
NyStyleRecipe
将子类化
Recipe
,并提供
PizzaChef
类用于创建比萨饼的生成器方法。在这个单独的实现中,
Builder
模式的
Directpr
实际上是您原始图表中描述的客户机

但正如我之前试图暗示的,这不是实现
Builder
模式的唯一方法,我认为它增加了Builder设计用来克服的限制。我会使用一个composeable
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);
请注意,我使用复合建设者重复使用薄皮和新鲜蛤蜊。对于
抽象工厂


我希望这能进一步澄清分歧

在pizza示例中,如果NYstore充当客户,那么它将获得productA、produtB。。。等从工厂直接访问,但如果我们将NYStore视为pizzachef(如tcarvin所建议的),客户将其访问以获得完整的比萨饼,则其将充当构建者(pizzache作为directore,配料类作为构建者) 下面的图片可以准确地看出确切的区别是什么 注意:我把这张图片放在这里是为了让任何访问这篇文章的人都能很容易地理解

现在我也饿了


感谢liviu拍摄了这张照片。

可能重复的区别通常是关于原因而不是原因how@doctorlove所以我们可以说NYStore是一个构建者,因为它返回的比萨饼对象由面团、酱汁、蔬菜等组成