#include <QCoreApplication>
#include <QList>
#include <QDebug>
#include <QString>
///NOTE6建造者模式
//建造者模式提供了一种模板使得在构建方法不变或者不公开的情况下根据不同需求构建不同对象
//建造者模式中一般分为三种角色:产品、建造者、指挥者。不同的建造者根据不同的参数生产类似的产品,指挥者指挥
//建造者的生产过程,客户只要选择不同的建造者,令指挥者指挥生产即可,改变产品无需知道生产细节,只要
//重新制定指挥者即可。下面的例子用菜、厨师和饭店经理分别指代以上三者
//食物类
class Food
{
public:
~Food() {}
void Say()
{
qDebug() << "I have" << strMain << strIngredient << strContainer;
}
QString strMain;//主材
QString strIngredient;//辅材
QString strContainer;//容器
};
//厨师接口-每个厨师都会做主材、辅材和摆盘
class Chef
{
public:
virtual void MakeMain() = 0;
virtual void MakeIngredient() = 0;
virtual void MakeContainer() = 0;
virtual ~Chef() {}
};
//面条厨师
class NoodleChef: public Chef
{
public:
NoodleChef(Food *food)
{
this->_food = food;
}
void MakeMain()
{
_food->strMain = "Noodle";
}
void MakeIngredient()
{
_food->strIngredient = "Tomato";
}
void MakeContainer()
{
_food->strContainer = "Bowl";
}
private:
Food *_food;
};
//热狗厨师
class HotdogChef: public Chef
{
public:
HotdogChef(Food *food)
{
this->_food = food;
}
void MakeMain()
{
_food->strMain = "Bread";
}
void MakeIngredient()
{
_food->strIngredient = "Sausage";
}
void MakeContainer()
{
_food->strContainer = "PaperBag";
}
private:
Food *_food;
};
//饭店经理
class Manager
{
public:
void MakeFood(Chef *chef)
{
chef->MakeMain();
chef->MakeIngredient();
chef->MakeContainer();
}
};
int main(int, char **)
{
///建造者模式测试
Food *food = new Food();
Chef *noodleChef = new NoodleChef(food);//招聘一个面条厨师
Chef*hotdogChef = new HotdogChef(food);//招聘一个热狗厨师
Manager *manager = new Manager();
manager->MakeFood(noodleChef);//经理让面条厨师做菜
food->Say();
manager->MakeFood(hotdogChef);//经理让热狗厨师做菜
food->Say();
getchar();
delete food;
delete noodleChef;
delete hotdogChef;
delete manager;
}
结果
建造者模式比较简单,将同一个类的不同实例化过程抽象化(chef类),用一个固定流程来管理,客户只需要指定抽象过程的不同实现即可清晰地管理好不同实例的初始化。