最近我接触了建造者设计模式。看起来不同的作者用“建造者模式”指代不同的变体,所以让我描述一下我所询问的模式。
我们有一个用于创建 产品 的算法,即不同类型的对象。在足够抽象的层面上,对于所有产品类型,算法都是相同的,但每种产品类型需要算法的每个抽象步骤的不同实现。例如,我们可能有以下制作蛋糕的算法:
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
。该类将接受(来自客户端的)具体构建器对象,并使用其方法以创建并返回所需的产品。
我的问题是:为什么需要将导演与抽象构建器分开?为什么不将它们合并为单个构建器抽象基类,使原始抽象构建器的公共方法受保护(并且具体子类像以前一样覆盖这些方法)?