设计模式之建造者模式实例(c++)
·
建造者模式实例之KFC
KFC套餐类图:

在建造者模式中,客户端不必知道产品内部的组成细节,将产品本身与其创建过程解耦,使得相同的创建过程可以创建不同的产品对象。但一般适用于组成部分相似的产品。
在此实例中,客户指出套餐种类,然后由Waiter提供做好的套餐(construct),此过程中,套餐的生产与提供隔离,客户不知道套餐是如何生产的,只负责接收,实现解耦。
产品类Meal(套餐类) :
//产品类Meal(套餐类)
class Meal{
public:
//food和drink是部件
void setFood(string food){
this->food = food;
}
void setDrink(string drink){
this->drink = drink;
}
string getFood(){
return food;
}
string getDrink(){
return drink;
}
private:
string food;
string drink;
};
抽象建造者类MealBuilder(套餐建造者类):
//抽象建造者类MealBuilder(套餐建造者类)
class MealBuilder{
public:
virtual void buildFood()=0;
virtual void buildDrink()=0;
Meal getMeal(){
return meal;
}
protected:
Meal meal;
};
具体建造者类SubMealBuilderA(A套餐建造者类):
//具体建造者类SubMealBuilderA(A套餐建造者类)
class SubMealBuilderA : public MealBuilder{
public:
void buildFood(){
meal.setFood("一个鸡腿堡");
}
void buildDrink(){
meal.setDrink("一杯可乐");
}
};
具体建造者类SubMealBuilderB(B套餐建造者类) :
//具体建造者类SubMealBuilderB(B套餐建造者类)
class SubMealBuilderB : public MealBuilder{
public:
void buildFood(){
meal.setFood("一个鸡肉卷");
}
void buildDrink(){
meal.setDrink("一杯果汁");
}
};
指挥者类KFCWaiter(服务员) :
//指挥者类KFCWaiter(服务员)
class KFCWaiter{
public:
void setMealBuilder(MealBuilder *mb){
this->mb = mb;
}
Meal construct(){
mb->buildFood();
mb->buildDrink();
return mb->getMeal();
}
private:
MealBuilder *mb;
};
客户端测试类Client :
//客户端测试类Client
int main(void){
//(假装)动态确定套餐种类
MealBuilder *mb = new SubMealBuilderB();
//服务员是指挥者
KFCWaiter *waiter = new KFCWaiter();
//服务员准备套餐
waiter->setMealBuilder(mb);
//客户获得套餐
Meal meal = waiter->construct();
cout << "套餐组成:" << endl
<< meal.getFood() << endl
<< meal.getDrink() << endl;
return 0;
}
(End)
更多推荐
所有评论(0)