Difference between Abstract factory and builder?
有趣。我建议对图表进行一些更改,使其符合GoF定义的经典Builder模式。
最大的区别在于,在构建器模式中,"导演"不会意识到构建器的细节。因此,不是使用名为
一个很好的副作用是你可以很容易地混合和匹配构成Recipe类的构建器,这样你就可以使用与NYStyle相同的所有成分构建器来创建NewHavenStyle比萨饼,但交换
当然,现在我饿了:)
请注意,不要混淆模式的名称(这是一种可重用的技术,几乎总是涉及多个对象/参与者/角色),以及模式中特定角色的名称。此外,通常模式构建在彼此之上并且具有很多重叠。
在Builder模式中,有一个
现在,正如
但正如我之前试图提到的那样,这不是唯一必须实现
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); |
请注意,我使用可组合的建造者来重复使用薄皮和新鲜的蛤蜊。对于
我希望能更多地澄清差异!
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. |
1 | Thanks to liviu for this image |