设计模式之建造者模式-其实,每个程序员都是一名建造者!
一、建造者模式的概念
建造者模式模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,把复合对象的
建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
二、建造者模式使用场景
1、一个对象的构建比较复杂,将一个对象的构建和对象的表示进行分离。
2、对象内部各个属性之间有相互依赖的关系。
三、建造者模式构建方法
1、抽象建造者类
为创建产品各个部分提供统一抽象接口。
2、构建具体建造者类
构建具体的创建产品的各个部分。
3、指挥者类
构造一个使用抽象建造者接口的对象。
4、构建具体产品类
建造者模式所创建的具体产品实例化对象。
四、建造者模式的示例
// BuilderPattern.cpp : 此文件包含 “main” 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <string>
using namespace std;
class Phone
{
public:
void setChip(string chip)
{
m_chipStr = chip;
}
void setScreen(string screen)
{
m_screenStr = screen;
}
void setShell(string shell)
{
m_shellStr = shell;
}
string getChip()
{
return m_chipStr;
}
string getScreen()
{
return m_screenStr;
}
string getShell()
{
return m_shellStr;
}
private:
string m_chipStr;
string m_screenStr;
string m_shellStr;
};
class Builder
{
public:
virtual void makeChip() = 0; // 手机芯片
virtual void makeScreen() = 0; // 手机屏幕
virtual void makeShell() = 0; // 手机壳
virtual Phone* getPhone() = 0; // 手机
};
class HuaWeiPhoneBuild : public Builder
{
public:
HuaWeiPhoneBuild()
{
m_pPhone = new Phone;
}
virtual void makeChip()
{
m_pPhone->setChip("HuaWei Chip");
}
virtual void makeScreen()
{
m_pPhone->setScreen("HuaWei Screen");
}
virtual void makeShell()
{
m_pPhone->setShell("HuaWei Shell");
}
virtual Phone *getPhone()
{
return m_pPhone;
}
private:
Phone *m_pPhone;
};
class XiaoMiPhoneBuild : public Builder
{
public:
XiaoMiPhoneBuild()
{
m_pPhone = new Phone;
}
virtual void makeChip()
{
m_pPhone->setChip("XiaoMi Chip");
}
virtual void makeScreen()
{
m_pPhone->setScreen("XiaoMi Screen");
}
virtual void makeShell()
{
m_pPhone->setShell("XiaoMi Shell");
}
virtual Phone *getPhone()
{
return m_pPhone;
}
private:
Phone *m_pPhone;
};
class Director
{
public:
void creatPhone(Builder *pBuilder)
{
pBuilder->makeChip();
pBuilder->makeScreen();
pBuilder->makeShell();
}
};
#define DELETE_PTR(p) {if(p!=nullptr){delete (p); (p)=nullptr;}}
int main()
{
Director *pDirector = new Director;
// 指挥者指挥建造产品
HuaWeiPhoneBuild *pHuaWeiBuilder = new HuaWeiPhoneBuild;
pDirector->creatPhone(pHuaWeiBuilder);
Phone *pHuaWeiPhone = pHuaWeiBuilder->getPhone();
XiaoMiPhoneBuild *pXiaoMiBuilder = new XiaoMiPhoneBuild;
pDirector->creatPhone(pXiaoMiBuilder);
Phone *pXiaoMiPhone = pXiaoMiBuilder->getPhone();
// 输出测试
cout << "------HuaWei--------" << endl;
cout << "Chip: " << pHuaWeiPhone->getChip() << endl;
cout << "Screen: " << pHuaWeiPhone->getScreen() << endl;
cout << "Shell: " << pHuaWeiPhone->getShell() << endl;
cout << "------XiaoMi--------" << endl;
cout << "Chip: " << pXiaoMiPhone->getChip() << endl;
cout << "Screen: " << pXiaoMiPhone->getScreen() << endl;
cout << "Shell: " << pXiaoMiPhone->getShell() << endl;
DELETE_PTR(pDirector);
DELETE_PTR(pHuaWeiBuilder);
DELETE_PTR(pXiaoMiBuilder);
DELETE_PTR(pHuaWeiPhone);
DELETE_PTR(pXiaoMiPhone);
std::cout << "Hello World!\n";
getchar();
}
运行结果:
五、建造者模式的优缺点
优点:
建造者本身独立且易于扩展
容易把控细节风险
缺点:
产品之间必须有共同点
产品太复杂的话将会有很多的建造类
能力有限,如有错误,多多指教。。。
本文为博主原创文章,未经博主允许请勿转载!作者:ISmileLi