C++设计模式_创建型模式_建造者模式Builder
本篇文章记录建造者模式。
建造者模式定义
建造者模式,也称为构建器模式,构建者模式,属于创建型模式。引入建造者(Builder)模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
通常用于创建比较复杂的对象,继续使用三个怪物类的示例说明构建者模式。
一个具体实现范例的逐步重构
还是三个怪物:亡灵类,元素类,机械类
怪物组成:头部,躯干(颈部,尾巴),肢体 三个部位组成
编码步骤:将怪物躯干部模型信息读入内存,将怪物的头部和四肢模型信息读入内存;
下面的方式类似于最初的模板方法模式。
loadTrunk(string strno) ,loadHead(string strno) ,loadLibs(string strno) 称为构建过程相关的函数。
引入与怪物类同层次的相关构建器类,把怪物类中代码搬到相关的构建器类中。
/*怪物类组成:头部,躯干,肢体 三部分组成。
*/
// loadTrunk loadHead loadLibs
class CMonster
{
public:// 组装怪物void setUp(string_view strmode){loadTrunk(strmode.substr(1,2));loadHead(strmode.substr(3, 2));loadLibs(strmode.substr(5, 2));}virtual void loadTrunk(string_view str) = 0;virtual void loadHead(string_view str) = 0;virtual void loadLibs(string_view str) = 0;
};// 创建三个怪物
class CUndead : public CMonster
{
public:virtual void loadTrunk(string_view str) override{cout << "组装 亡灵类躯干 " << str << endl;}virtual void loadHead(string_view str) override{cout << "组装 亡灵类头部 " << str << endl;}virtual void loadLibs(string_view str) override{cout << "组装 亡灵类四肢 " << str << endl;}
};class CElement : public CMonster
{
public:virtual void loadTrunk(string_view str) override{cout << "组装 元素类 躯干 " << str << endl;}virtual void loadHead(string_view str) override{cout << "组装 元素类 头部 " << str << endl;}virtual void loadLibs(string_view str) override{cout << "组装 元素类 四肢 " << str << endl;}
};class CMechanic : public CMonster
{
public:virtual void loadTrunk(string_view str) override{cout << "组装 机械类躯干 " << str << endl;}virtual void loadHead(string_view str) override{cout << "组装 机械类头部 " << str << endl;}virtual void loadLibs(string_view str) override{cout << "组装 机械类四肢 " << str << endl;}
};void test()
{CMonster* pbase = new CMechanic();pbase->setUp("22558899");/*组装 机械类躯干 25组装 机械类头部 58组装 机械类四肢 89*/
}
使用string.substr(index,N)对字符串进行了切割。
使用string_view来代替字符串,提高的效率。
引入建造者(Builder)模式
引入建造者(Builder)模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
CMonsterBuilder类就是对象的构建,CMonster类是对象的表示, CMonsterBuilder类种包含了CMonster类。
namespace _nmsp2
{class CMonster{public:virtual ~CMonster(){}};class CUndead : public CMonster{public:};class CElement : public CMonster{public:};class CMechanic : public CMonster{public:};// 怪物类构建器 父类class CMonsterBuilder{public:virtual ~CMonsterBuilder(){}CMonster* getpMonster(){return pbase;}virtual void loadTrunk(string strno) = 0;virtual void loadHead(string strno) = 0;virtual void loadLibs(string strno) = 0;// protected:CMonster* pbase;};// 亡灵类构建器class CUndeadBuilder : public CMonsterBuilder{public:CUndeadBuilder() //构造函数:在怪物类的构建器的构造函数中new 对应类{pbase = new CUndead();}virtual void loadTrunk(string strno){cout << "组装 亡灵类 躯干" << endl;}virtual void loadHead(string strno){cout << "组装 亡灵类 头部" << endl;}virtual void loadLibs(string strno){cout << "组装 亡灵类 四肢" << endl;}};class CElementBuild : public CMonsterBuilder{public:CElementBuild(){pbase = new CElement();}virtual void loadTrunk(string strno){cout << "组装元素类躯干" << endl;}virtual void loadHead(string strno){cout << "组装 元素类 头部" << endl;}virtual void loadLibs(string strno){cout << "组装 元素类 四肢" << endl;}};class CMeChanicBuild : public CMonsterBuilder{public:CMeChanicBuild(){pbase = new CMechanic();}virtual void loadTrunk(string strno){cout << "组装 机械类 躯干" << endl;}virtual void loadHead(string strno){cout << "组装 机械类 头部" << endl;}virtual void loadLibs(string strno){cout << "组装 机械类 四肢" << endl;}};// 指挥者类class CMonsterDirector{public:CMonsterDirector(CMonsterBuilder* pbuild){pdirector = pbuild;}// 指定新的构建器 void SetBuilder(CMonsterBuilder* ptmpBuilder){pdirector = ptmpBuilder;}CMonster* construct(string strmodelno){pdirector->loadTrunk(strmodelno.substr(4, 3)); // 截取躯干部分字符串,表示躯干的编号;pdirector->loadHead(strmodelno.substr(7, 3)); // 截取 头部pdirector->loadLibs(strmodelno.substr(10, 3)); // 截取四肢return pdirector->getpMonster();}private:CMonsterBuilder* pdirector;};void test(){_nmsp2::CMonsterBuilder* pmb = new _nmsp2::CUndeadBuilder();_nmsp2::CMonsterDirector* pDirect = new _nmsp2::CMonsterDirector(pmb);_nmsp2::CMonster* pCMonster = pDirect->construct("2222222233333333334444444");/*组装 亡灵类 躯干组装 亡灵类 头部组装 亡灵类 四肢*/}
}
构造者模式四种角色
构造者模式包含的四种角色:
1 Builder 抽象构建器,这里指CMonsterBuilder
2 具体构建器:CUndeadBuilder, CElementBuilder, CMechanicBuilder,
3 产品:这里指:CUndead, CElement, CMechanic
4 指挥者Director: CMonsterDirector
构造者模式结构
关系梳理:各个怪物与怪物构造者之间是组合关系;构造者被指挥者指挥,他们之间是聚合关系。