1.说明
请参阅本系列第一章节
2.建造者模式说明
构造者模式:将一个复杂的构建与它的表示分离,使得同样的构建过程,可以创建不同的表示。即生成具有不同内部表象的产品对象。在使用的时候,用户只需要知道构建的对象就行了,而不需要知道构建的细节。客户端通过调用指挥者的接口,来控制构建过程,使得能够隔离用户的构建过程
注意事项:指挥者的构建过程必须足够普遍,以此来构建不同的具体的对象。如果这些构建的对象的有相同的属性或行为,也可以在指挥者中构建公共的方法
好处:建造的代码与表示代码分离,耦合度更低,构建者隐藏了产品的组装,使得表示代码更关注实现,如需修改,只需要修改实现细节,不用修改创建流程
感觉和工厂模式,模板方法模式都比较类似:都是需要注意的是:
工厂是生产不同对象,而建造者模式是构建具有不同内部表示的对象,注重细节
如果仅仅是构建对象内部的部分参数不同,可以通过传入参数的方式来构建,而不是用派生的方式来添加
3.UML
4.代码
代码背景:不同品牌的电脑,组装流程是一样的,代码简单较少了电脑的组装过程
//建造者模式基类:BuildComBase.h
#ifndef __BUILDCOMBASE_H
#define __BUILDCOMBASE_H
#include <iostream>
class CBuildComBase
{
public:
virtual void create_cpu() = 0;
virtual void create_mem() = 0;
virtual void create_mainboard() = 0;
virtual void create_harddisk() = 0;
virtual void create_others()
{
std::cout<<"windows system"<<std::endl;
std::cout<<"mouth"<<std::endl;
std::cout<<"power"<<std::endl;
}
};
#endif
//thinkpad 创建流程 ThinkPad.h
#ifndef __THINKPAD_H
#define __THINKPAD_H
#include "BuildComBase.h"
class CThinkPad:public CBuildComBase
{
public:
virtual void create_cpu()
{
std::cout<<"thinkpad cpu"<<std::endl;
}
virtual void create_mem()
{
std::cout<<"thinkpad mem"<<std::endl;
}
virtual void create_mainboard()
{
std::cout<<"thinkpad mainboard"<<std::endl;
}
virtual void create_harddisk()
{
std::cout<<"thindpad harddisk"<<std::endl;
}
};
#endif
//mac: Mac.h
#ifndef __MAC_H
#define __MAC_H
#include "BuildComBase.h"
class CMac:public CBuildComBase
{
public:
virtual void create_cpu()
{
std::cout<<"mac CPU"<<std::endl;
}
virtual void create_mem()
{
std::cout<<"mac mem"<<std::endl;
}
virtual void create_mainboard()
{
std::cout<<"mac mainboard"<<std::endl;
}
virtual void create_harddisk()
{
std::cout<<"mac harddisk"<<std::endl;
}
};
#endif
//指挥者Dector.h
#ifndef __DECTOR_H
#define __DECTOR_H
#include "BuildComBase.h"
class CDector
{
public:
void create_builder(CBuildComBase* build)
{
create_buil(build);
}
private:
void create_buil(CBuildComBase* build)
{
build->create_cpu();
build->create_mem();
build->create_mainboard();
build->create_harddisk();
build->create_others();
}
};
#endif
//client:客户端通过指挥者即可创建,而不用关注内部的创建细节
#include <iostream>
#include "Dector.h"
#include "Mac.h"
#include "ThinkPad.h"
#include "BuildComBase.h"
int main(void)
{
CBuildComBase* mac = new CMac;
CBuildComBase* thinkpad = new CThinkPad;
CDector* dector = new CDector();
std::cout<<"begin create thindpad:"<<std::endl;
dector->create_builder(thinkpad);
std::cout<<"begin create mac:"<<std::endl;
dector->create_builder(mac);
std::cout<<"create end"<<std::endl;
return 0;
}