一,动机
简而言之,这个模式为了构造一些复杂的对象。诸如汽车,它包括多个部件。对大多数用户而言,不必知道这些部件的装配细节,而是直接使用整个对象。
二,定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式是一步步创建一个复杂的对象。用户只通过指定复杂对象的类型和内容即可构建他们,例如宝马汽车。。不需要知道内部的具体构造过程,例如,不需要知道是先装轮子还是先装配发动机。
三,模式结构
1,Builder(抽象构造者)
规定了产品对象的各个部件的指定接口。在该接口中,一般声明两类方法:a,buildPartX,用于构造复杂对象的各个部件。b,getResult。用于返回复杂对象
2,ConcreteBuilder(具体构造者)
实现抽象构造的接口
3,Product(产品角色)
被构造的复杂对象
4,Director(指挥者)
负责安排复杂对象的构造次序。 其包含一个construct方法来进来逐部件构造
四,代码实例
以订购套餐为例:提供A,B两种套餐
其中服务员充当指挥者角色。
#include <iostream>
using namespace std;
class Meal
{
private:
string food;
string drink;
public:
void setFood(string tmp)
{
this->food = tmp;
}
void setDrink(string tmp)
{
this->drink = tmp;
}
string getFood()
{
return food;
}
string getDrink()
{
return drink;
}
};
class MealBuilder
{
protected:
Meal* meal;
public:
virtual void buildFood() =0;
virtual void buildDrink()=0;
MealBuilder()
{
SetMeal(new Meal());
}
void SetMeal(Meal* tmp)
{
this->meal = tmp;
}
Meal* getMeal()
{
return meal;
}
};
class SubMealBuilderA :public MealBuilder
{
public:
void buildFood()
{
meal->setFood("汉堡包");
}
void buildDrink()
{
meal->setDrink("可口可乐");
}
};
class SubMealBuilderB :public MealBuilder
{
void buildFood()
{
meal->setFood("薯条鸡翅");
}
void buildDrink()
{
meal->setDrink("冰红茶");
}
};
class Waiter
{
private:
MealBuilder* mb;
public:
void SetMealBuilder(MealBuilder* tmp_mb)
{
this->mb = tmp_mb;
}
Meal* construct()
{
mb->buildDrink();
mb->buildFood();
return mb->getMeal();
}
};
int main()
{
MealBuilder* tmp_mb = new SubMealBuilderB();
Waiter tmp_wai;
tmp_wai.SetMealBuilder(tmp_mb);
Meal* tmp_meal = tmp_wai.construct();
cout<<tmp_meal->getDrink()<<endl;
cout<<tmp_meal->getFood()<<endl;
return 0;
}
输出:
冰红茶
薯条鸡翅
要是应用Java反射机制就显得特别方便了。可以在配置文件中指定构造的套餐。
缺点:
构造的产品必须有统一的配置。对于上述例子,都必须是 Food + Drink 假如有其他附属品就不可以应用这种模式了。