最近我遇到了Builder的设计模式。似乎不同的作者使用“生成器模式”来指代不同的口味,所以让我描述一下我所问的模式。生成器设计模式:为什么我们需要一个Director?
我们有一个算法来创建产品,即不同类型的对象。在足够高的抽象层次上,所有产品类型的算法都是相同的,但是每种产品类型都需要对算法的每个抽象步骤进行不同的实现。例如,我们可能有以下的制饼算法:
1. Add liquids.
2. Mix well.
3. Add dry ingredients.
4. Mix well.
5. Pour batter into baking pan.
6. Bake.
7. Return baked cake.
不同的蛋糕将需要这些步骤的不同实现,即什么样的液体/干配料使用,在混合什么样的速度,多长时间烘烤等
该模式说这样做。对于每种产品,我们都会为每个上述步骤创建一个混凝土生成器类。所有这些类都来自抽象构建器基类,它基本上是一个接口。因此,例如,我们将有一个抽象基类CakeBaker
用纯虚方法AddLiquid()
,MixLiquids()
等具体蛋糕面包师将是具体的子类,例如,
class ChocolateCakeBaker : public CakeBaker {
public:
virtual void AddLiquids()
{
// Add three eggs and 1 cup of cream
}
virtual void AddDryIngredients()
{
// Add 2 cups flour, 1 cup sugar, 3 tbsp cocoa powder,
// 2 bars ground chocolate, 2 tsp baking powder
}
...
...
};
的LemonCitrusCakeBaker
也将是CakeBaker
一个子类,但在其方法中会使用不同的成分和数量。
不同的蛋糕类型将同样是抽象Cake
基类的子类。
最后,我们有一个类来实现抽象算法。这是导演。在面包店的例子中,我们可以称之为ExecutiveBaker
。这个类将接受(从客户端)一个具体的构建器对象并使用它的方法来创建和返回所需的产品。
这是我的问题。为什么我们需要导演与抽象建筑师分开?为什么不将它们转换为单个构建器抽象基类,使得原始抽象构建器的公共方法受到保护(并且具体的子类像前面一样覆盖它们)。
责任的分离让我不服气。在某些情况下,分离可能是有意义的;在别人不是。我不认为这是模式的一部分,而是作为一个正交决定。 – Ari 2010-12-01 08:39:40
学习DP我试图让他们的原则不会直接复制它们。而且在实践中我经常把它们组合起来。因此,不需要像在doc中那样编写相同数量的类或接口,而是使您的代码更加灵活和可修改。 – Arseny 2010-12-01 08:52:24