抽象工厂和建筑商之间的区别?

时间:2014-07-11 11:37:55

标签: design-patterns builder abstract-factory

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

抽象工厂模式:

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

3 个答案:

答案 0 :(得分:9)

有趣。我建议对图表进行一些更改,使其符合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(来自该名称的模式)上一样,您可以使用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

时,这并不容易

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:-1)

    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

Thanks to liviu for this image