建造者把产品细节的实现过程单独封装成类,完成产品本身和创建产品之间的解耦。每一个建造者都相对独立,因此在建造细节实现方面实现了灵活性和可扩展性。
建造者模式和工厂模式的区别:工厂模式关心把这个产品创建出来,而不关心其细节;建造者模式不仅需要把产品生产出来,还需要关心生产细节。
建造者的核心在于将建造者独立成不同的子类,以实现建造过程的灵活性和可扩展性。
#include<iostream>
#include<string>
using namespace std;
class Meal{
public:
void setBurger(string str){
burger = str;
}
void setFries(string str){
fries = str;
}
void setDrink(string str){
drink = str;
}
void print(){
std::cout << burger << std::endl;
std::cout << fries << std::endl;
std::cout << drink << std::endl;
}
private:
string burger;
string fries;
string drink;
};
class MealBuilder{
public:
virtual void buildBurger(){}
virtual void buildFries(){}
virtual void buildDrink(){}
virtual Meal* getMeal(){
return meal;
}
Meal* meal = new Meal();
};
class ChickenMealBuilder : public MealBuilder{
public:
void buildBurger(){
meal->setBurger("鸡肉汉堡");
}
void buildFries(){
meal->setFries("中份薯条");
}
void buildDrink(){
meal->setDrink("大杯果汁");
}
};
class BeefBurgerMealBuilder : public MealBuilder{
public:
void buildBurger(){
meal->setBurger("牛肉汉堡");
}
void buildFries(){
meal->setFries("大份薯条");
}
void buildDrink(){
meal->setDrink("中杯可乐");
}
};
class ShrimpMealBuilder : public MealBuilder{
public:
void buildBurger(){
meal->setBurger("虾肉汉堡");
}
void buildFries(){
meal->setFries("小份薯条");
}
void buildDrink(){
meal->setDrink("大杯芬达");
}
};
class MealDirector{
public:
void setMealBuilder(MealBuilder* mealBuilder){
this->mealBuilder = mealBuilder;
}
Meal* getMeal(){ return mealBuilder->getMeal(); }
void constructMeal(){
mealBuilder->buildBurger();
mealBuilder->buildFries();
mealBuilder->buildDrink();
}
private:
MealBuilder* mealBuilder;
};
int main(){
MealDirector* director = new MealDirector();
director->setMealBuilder(new BeefBurgerMealBuilder());
director->constructMeal();
Meal* meal = director->getMeal();
meal->print();
}