建造者模式隐藏产品制造过程,客户端只需要配置产品的属性,然后指定一个制造者进行加工。
将复杂对象的制造过程隐藏;
一个建造者对应一种产品表现形式;
//电脑 产品
class Computer
{
public:
Computer() :m_cpu(), m_hardDisk(0), m_memSize(0) {}
void setCpu(const string& cpu)
{
m_cpu.assign(cpu);
}
void setMemSize(const int size)
{
m_memSize = size;
}
void setHardDisk(const int size)
{
m_hardDisk = size;
}
void setNameplate(const string& name)
{
m_name.assign(name);
}
void showComputer()
{
cout << "nameplate:" << m_name << ",cpu:" << m_cpu << ",memsize:" << m_memSize << ",hardDisk:" << m_hardDisk << endl;
}
private:
string m_cpu; // cpu型号
string m_name; // 电脑铭牌
int m_memSize; // 内存大小
int m_hardDisk; // 硬盘大小
};
// 抽象出电脑生产商公共方法
class ComputerMaker
{
public:
virtual void setCpu(const string& cpu)=0;
virtual void setMemSize(const int size)=0;
virtual void setHardDisk(const int size)=0;
virtual Computer* printComputer() = 0;
protected:
ComputerMaker(){}
~ComputerMaker(){ }
};
//Dell电脑 生产商
class DellMaker : public ComputerMaker
{
public:
DellMaker() :ComputerMaker(),m_computer(new Computer())
{
m_computer->setNameplate("Dell");
}
~DellMaker() { delete m_computer; m_computer = NULL; }
Computer* printComputer() override
{
return m_computer;
}
void setCpu(const string& cpu) override
{
m_computer->setCpu(cpu);
}
void setHardDisk(const int size) override
{
m_computer->setHardDisk(size);
}
void setMemSize(const int size) override
{
m_computer->setMemSize(size);
}
private:
Computer* m_computer;
};
//ThinkPad电脑 生产商
class ThinkPadMaker : public ComputerMaker
{
public:
ThinkPadMaker() :ComputerMaker(), m_computer(new Computer())
{
m_computer->setNameplate("ThinkPad");
}
~ThinkPadMaker() { delete m_computer; m_computer = NULL; }
Computer* printComputer() override
{
return m_computer;
}
void setCpu(const string& cpu) override
{
m_computer->setCpu(cpu);
}
void setHardDisk(const int size) override
{
m_computer->setHardDisk(size);
}
void setMemSize(const int size) override
{
m_computer->setMemSize(size);
}
private:
Computer* m_computer;
};
// 电脑生产商
class Manager
{
public:
Manager(const string& cpu, const int memSize, const int diskSize)
:m_cpu(cpu), m_memSize(memSize), m_diskSize(diskSize)
{
}
Computer* setComputerBuilder(ComputerMaker* builder)
{
builder->setCpu(m_cpu);
builder->setMemSize(m_memSize);
builder->setHardDisk(m_diskSize);
return builder->printComputer();
}
private:
string m_cpu;
int m_memSize;
int m_diskSize;
};
int main()
{
// 我想要一个什么配置的电脑
Manager *manager = new Manager("Intel I7",8,500);
// 定义电脑生产商
DellMaker* dell = new DellMaker();
ThinkPadMaker* thinkPad = new ThinkPadMaker();
// 安排生产商 生产电脑
Computer* dellComputer = manager->setComputerBuilder(dell);
Computer* thinkPadComputer = manager->setComputerBuilder(thinkPad);
// 将生产出电脑展示出来
dellComputer->showComputer();
thinkPadComputer->showComputer();
}