//Creational Patterns--builder
//创建型模式--建造者模式
//1.Builder 抽象建造者
//2.ConcreteBuilder 具体建造者
//3.Director 指挥者
//4.Product 产品
//产品:电脑
class Computer
{
public:
void SetCpu(string cpu){m_strCpu = cpu;}
void SetMainBoard(string mainboard){m_strMainBoard = mainboard;}
void SetRam(string ram){m_strRam = ram;}
void SetVideoCard(string videocard){m_strVideoCard = videocard;}
string GetCpu(){return m_strCpu;}
string GetMainBoard(){return m_strMainBoard;}
string GetRam(){return m_strRam;}
string GetVideoCard(){return m_strVideoCard;}
private:
string m_strCpu;
string m_strMainBoard;
string m_strRam;
string m_strVideoCard;
};
//抽象建造者
class IBuilder
{
public:
virtual void BuildCpu() = 0;
virtual void BuildMainBoard() = 0;
virtual void BuildRam() = 0;
virtual void BuildVideoCard() = 0;
virtual Computer* GetResult() = 0;
};
//具体建造者:thinkpad
class ThinkPadBuilder : public IBuilder
{
public:
ThinkPadBuilder(){m_pComputer = new Computer();}
~ThinkPadBuilder(){if(m_pComputer) delete m_pComputer;}
void BuildCpu(){m_pComputer->SetCpu("i5-6200u");}
void BuildMainBoard(){m_pComputer->SetMainBoard("Intel DH5700");}
void BuildRam(){m_pComputer->SetRam("DDR4");}
void BuildVideoCard(){m_pComputer->SetVideoCard("NVIDIA Geforce 920MX");}
Computer* GetResult(){return m_pComputer;}
private:
Computer *m_pComputer;
};
//具体建造者:yoga
class YogaBuilder : public IBuilder
{
public:
YogaBuilder(){m_pComputer = new Computer();}
~YogaBuilder(){if(m_pComputer) delete m_pComputer;}
void BuildCpu(){m_pComputer->SetCpu("i7-7500u");}
void BuildMainBoard(){m_pComputer->SetMainBoard("Intel DP55KG");}
void BuildRam(){m_pComputer->SetRam("DDR5");}
void BuildVideoCard(){m_pComputer->SetVideoCard("NVIDIA Geforce 950MX");}
Computer* GetResult(){return m_pComputer;}
private:
Computer *m_pComputer;
};
//指挥者
class Director
{
public:
void Create(IBuilder *pbuilder)
{
pbuilder->BuildCpu();
pbuilder->BuildMainBoard();
pbuilder->BuildRam();
pbuilder->BuildVideoCard();
}
};
//---------------------------------------------------------------
//测试
void dpBuilderMain()
{
Director* pDirector = new Director();
ThinkPadBuilder *pThinkPadBuilder = new ThinkPadBuilder();
YogaBuilder* pYogaBuilder = new YogaBuilder();
//组装两种电脑
pDirector->Create(pThinkPadBuilder);
pDirector->Create(pYogaBuilder);
//获取组装后的电脑
Computer *pThinkPadComputer = pThinkPadBuilder->GetResult();
Computer *pYogaComputer = pYogaBuilder->GetResult();
//分别测试
cout << "-----ThinkPad-----" << endl;
cout << "CPU: " << pThinkPadComputer->GetCpu() << endl;
cout << "MainBoard: " << pThinkPadComputer->GetMainBoard() << endl;
cout << "RAM: " << pThinkPadComputer->GetRam() << endl;
cout << "VideoCard: " << pThinkPadComputer->GetVideoCard() << endl;
cout << "-----Yoga-----" << endl;
cout << "CPU: " << pYogaComputer->GetCpu() << endl;
cout << "MainBoard: " << pYogaComputer->GetMainBoard() << endl;
cout << "RAM: " << pYogaComputer->GetRam() << endl;
cout << "VideoCard: " << pYogaComputer->GetVideoCard() << endl;
if(pDirector) delete pDirector;
if(pThinkPadBuilder) delete pThinkPadBuilder;
if(pYogaBuilder) delete pYogaBuilder;
return;
}