关于设计模式:抽象工厂和建筑商之间的区别?

Difference between Abstract factory and builder?

很抱歉再次询问。 我在网上搜索但是无法理解因此我必须放在这里。 这就是我自己研究的内容。 我从头部设计模式研究。

抽象工厂模式:

>
</p>
<p>
根据我研究的差异,建筑师有些感觉它是一个工厂,但是<br />
它只在大多数情况下创建一种类型。<br />
所以我可以说上面的图像中的NYStore是构建器,因为它将比萨对象返回给客户端?<br />
我对么? 请根据以上示例给出您的答案,这可能有助于我学习它。
</p>
<div class=


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

最大的区别在于,在构建器模式中,"导演"不会意识到构建器的细节。因此,不是使用名为NyPizzaStore的类,而是使用名为createPizza()的方法(显然)高度调整以创建NY样式的比萨饼,而是可以使用类调用PizzaChef来接受类的实例。定制披萨如何制作的细节。 (对于这个例子/类比,让我们重命名将PizzaIngerdientFactory重命名为Recipe,这样我们可以稍微区别对待它)。所以这给你PizzaChef.createPizza(Recipe r)。如果蛤蜊是新鲜的或冷冻的,PizzaChef课程无需担心,他只需轮流调用每个建筑商并创建所需的披萨。这是差异的关键......只有一个PizzaChef,他不知道食谱的细节(子类)。

一个很好的副作用是你可以很容易地混合和匹配构成Recipe类的构建器,这样你就可以使用与NYStyle相同的所有成分构建器来创建NewHavenStyle比萨饼,但交换BrickFiredThinCrust代替。更可定制化。 Recipe成为构建器实例的持有者。

当然,现在我饿了:)

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

在Builder模式中,有一个Director对象,它有一个createSomething()方法(不能调用它)。该方法将以非常公式的方式调用一个或多个部件构建器。客户端具有对Director的引用,并传入构建器。客户端直接或间接地影响构建的内容。 Director无需成为任何子类,它可以是一个简单的密封类。 PizzaChef不是客户,而是导演。它不会从任何东西继承,也不会继承。在这种情况下,客户端可能类似于Customer类。

现在,正如Abstract Factory模式构建在一组Factory Methods(来自该名称的模式)上一样,您可以使用Abstract Factory模式使用Abstract Factory模式。您可以将构建器作为AbstractFactory传递给Director。在这种情况下,Recipe将是您的AbstractFactory,NyStyleRecipe将子类化Recipe并提供PizzaChef类用于创建披萨的构建器方法。在这个特定的实现中,Builder模式的Directpr确实是客户端,如原始图中所述。

但正如我之前试图提到的那样,这不是唯一必须实现Builder模式,我认为它增加了Builder旨在克服的限制。我会使用一个可组合的Recipe类,因为你可以更容易地混合和匹配成分。薄皮和纽约式披萨之间没有真正的联系。纽黑文风格也采用轻薄风格。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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,这不会那么容易

我希望能更多地澄清差异!


Builder和抽象工厂模式类似,因为它们都在抽象层面上看待构造。 但是,Builder模式关注的是如何
单个对象由不同的工厂组成,而抽象工厂模式
关心的是什么产品。 Builder模式抽象出来
通过包括导演的概念来构建算法。 导演是
负责逐项列出步骤并调用构建器来实现它们。 董事们
不必符合界面。

其他示例(比您的)可能是创建产品而不是客户端
明确声明ProductA和ProductB类型的字段,比如Product对象
构建器返回实际上是一个部件列表,它可以具有不同的长度和内容
取决于创建时负责的导演。


1
2
3
4
5
6
7
8
9
10
11
12
13
    in pizza example if NYstore act as client
then it get productA, produtB etc from factory
 and can directly access.

    but if we treat NYStore as pizzachef
(as suggested by tcarvin ) and client accces it
 to get complete pizza it act as builder
(pizzache as directore and ingredient class as builder)
    Following image can exact tell what is the exact difference
    note : i am putting this image so whoever visit
this post can understand easily.

NOW I AM HUNGRY also.

enter image description here

1
Thanks to liviu for this image