首页 > 代码库 > 【设计模式】建造者模式
【设计模式】建造者模式
设计模式 之 建造者模式
//建造者模式
/************************************************************************
【建造者】提供了建造动作的接口
【具体建造者】去实现【建造者】的每个接口,对每个【具体建造者】来说,
创建【产品】的步骤相同,不同的只是“细节”
【产品】即每个【具体建造者】的实例
【指挥者】中去调用创建【产品】的每个接口,利用多台性质去调用每个【具体建造者】
实现的接口。
--------------------------------------------------------------------------
本文以生产不同型号的手机为例来说明,一个品牌的手机都有许多【型号】,这里的
不同【型号】即为不同的【具体创建者】,不同【型号】的手机只是“配置”不同,
生产手机的过程是相同的,[装主板]、[装GPS]、[装陀螺仪]、[装屏幕]、[装电池]、
[装外壳]等。
这些组装动作即为【建造者】提供的接口,而每个手机就是【产品】,【指挥者】可以
理解为“装配流水线”,流水线根据不同种类的【型号】去组装不同的元器件,从而
组装成一部手机。
注:实际可能是一种型号的手机对应一条流水线,而非前文所述的一条流水线可组装
多重型号的手机,但在这里姑且认为一条流水线对应多种型号。
************************************************************************/
【建造者】类,提供了组装手机的动作接口
//【建造者】类,提供组装手机的操作接口
class CPhoneBuilder
{
public:
CPhoneBuilder();
virtual ~CPhoneBuilder();
virtual void ZhuangMainbord() = 0; //装主板
virtual void ZhuangGPS() = 0; //装GPS
virtual void ZhuangTuoluoyi() = 0; //装陀螺仪
virtual void ZhuangScreen() = 0; //装屏幕
virtual void ZhuangWaike() = 0; //装外壳
};
CPhoneBuilder::CPhoneBuilder(){}
CPhoneBuilder::~CPhoneBuilder(){}
【三星S4】,一个【具体建造者】,也是一个【型号】, 实现了【建造者】的组装手机的接口
//【三星S4】,一个具体的建造者
class CS4Builder : public CPhoneBuilder
{
public:
CS4Builder();
virtual ~CS4Builder();
virtual void ZhuangMainbord(); //装主板
virtual void ZhuangGPS(); //装GPS
virtual void ZhuangTuoluoyi(); //装陀螺仪
virtual void ZhuangScreen(); //装屏幕
virtual void ZhuangWaike(); //装外壳
};
CS4Builder::CS4Builder(){cout<<"建造三星S4\n";}
CS4Builder::~CS4Builder(){}
void CS4Builder::ZhuangMainbord() {cout << "组装 型号A 主板\n";}
void CS4Builder::ZhuangGPS() {cout << "组装 型号A GPS\n";}
void CS4Builder::ZhuangTuoluoyi() {cout <<" 组装 型号A 陀螺仪\n";}
void CS4Builder::ZhuangScreen() {cout << "组装 型号A 大猩猩玻璃屏\n";}
void CS4Builder::ZhuangWaike() {cout << "组装 金属外壳A\n";}
【三星S5】,一个【具体建造者】,也是一个【型号】, 实现了【建造者】的组装手机的接口
//【三星S5】,一个具体建造者
class CS5Builder : public CPhoneBuilder
{
public:
CS5Builder();
virtual ~CS5Builder();
virtual void ZhuangMainbord(); //装主板
virtual void ZhuangGPS(); //装GPS
virtual void ZhuangTuoluoyi(); //装陀螺仪
virtual void ZhuangScreen(); //装屏幕
virtual void ZhuangWaike(); //装外壳
};
CS5Builder::CS5Builder() {cout << "建造三星S5\n";}
CS5Builder::~CS5Builder() {}
void CS5Builder::ZhuangMainbord() {cout << "组装 型号C 主板\n";}
void CS5Builder::ZhuangGPS() {cout << "组装 型号C GPS\n";}
void CS5Builder::ZhuangTuoluoyi() {cout <<" 组装 型号C 陀螺仪\n";}
void CS5Builder::ZhuangScreen() {cout << "组装 型号C 大猩猩玻璃屏\n";}
void CS5Builder::ZhuangWaike() {cout << "组装 塑料外壳C\n";}
【指挥者】类,指挥者根据传入的不同【型号】,去调用不同的【组装动作】,这些【组装动作】的细节不同,【细节】即手机的“配置”或“参数”不同,有的“为发烧而生”, 有的“忘记参数”,有的“重新定义了手机”。
//【指挥者】类,即组装流水线
class CLineDirector
{
public:
CLineDirector();
virtual ~CLineDirector();
//建造手机(多态性质)
void CreatePhone(CPhoneBuilder* builder);
};
CLineDirector::CLineDirector() {cout << std::endl << "准备建造手机" << std::endl<<std::endl;}
CLineDirector::~CLineDirector(){}
void CLineDirector::CreatePhone(CPhoneBuilder* builder)
{
if(NULL == builder) { cerr << std::endl << "不知道你要造神马手机" << std::endl; return;}
builder->ZhuangMainbord();
builder->ZhuangGPS();
builder->ZhuangTuoluoyi();
builder->ZhuangScreen();
builder->ZhuangWaike();
}
客户端
//客户端
int _tmain(int argc, _TCHAR* argv[])
{
CLineDirector director;
CS4Builder s4;
director.CreatePhone(&s4);
cout<<endl<<endl;
CS5Builder s5;
director.CreatePhone(&s5);
cout<<endl<<endl;
return 0;
}
运行情况
PS:
当在【指挥者】的CreatePhone函数中调用一系列组装函数时,感觉有点类似于前面的【外观模式】,又感觉有区别,
外观模式中:【外观】类中提供了一些列函数,这些函数是对各个【子系统】的函数调用的封装,或者个数不同,或者顺序不同,并没有一个各个子系统的“基类”,也没有用到【多态】性质;
建造者模式中:【建造者】首先是一个基类,他的多个子类(即【具体建造者】)是对该【建造者】类中的接口的不同实现,而各个子类在创建对象的时候,对这些接口(动作或操作)的步骤/调用顺序/流程 是相同的, 然后依赖于【指挥者】类中的不同输入,根据多态性质去调用不同的子类中的各个操作(去接口的实现)。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。