此为大话设计模式中的建造者模式的c++版本
/*
* builder.cpp
*
* Created on: Jul 25, 2017
* Author: clh01s@163.com
* 生成器(建造者)模式
* 将一个复杂的对象与它的表示分离,
* 使得同样的构建过程可以创建不同的
* 表示.
*/
#include <iostream>
#include <string>
//创建人的虚基类
class PersonBuilder
{
public:
virtual ~PersonBuilder(){}
//创建身体部分的纯虚函数
virtual void BuildHead()=0;
virtual void BuildBody()=0;
virtual void BuildArmLeft()=0;
virtual void BuildArmRight()=0;
virtual void BuildLegLeft()=0;
virtual void BuildLegRight()=0;
};
class PersonThinBuilder:public PersonBuilder
{
public:
//创建身体的每个部位
void BuildHead() override
{
std::cout<<"创建瘦子的头部"<<std::endl;
}
void BuildBody() override
{
std::cout<<"创建瘦子的身体"<<std::endl;
}
void BuildArmLeft() override
{
std::cout<<"创建瘦子的左手"<<std::endl;
}
void BuildArmRight() override
{
std::cout<<"创建瘦子的右手"<<std::endl;
}
void BuildLegLeft() override
{
std::cout<<"创建瘦子的左脚"<<std::endl;
}
void BuildLegRight() override
{
std::cout<<"创建瘦子的右脚"<<std::endl;
}
};
class PersonFatBuilder:public PersonBuilder
{
public:
//创建身体的每个部位
void BuildHead() override
{
std::cout<<"创建胖子的头部"<<std::endl;
}
void BuildBody() override
{
std::cout<<"创建胖子的身体"<<std::endl;
}
void BuildArmLeft() override
{
std::cout<<"创建胖子的左手"<<std::endl;
}
void BuildArmRight() override
{
std::cout<<"创建胖子的右手"<<std::endl;
}
void BuildLegLeft() override
{
std::cout<<"创建胖子的左脚"<<std::endl;
}
void BuildLegRight() override
{
std::cout<<"创建胖子的右脚"<<std::endl;
}
};
//指挥者类负责根据传入的参数来创建相应的肢体
class PersonDirector
{
public:
//构造函数初始化指针
PersonDirector(PersonBuilder *pb):_pb(pb){}
//开始构造相应的肢体
void CreatePerson()
{
_pb->BuildHead();
_pb->BuildBody();
_pb->BuildArmLeft();
_pb->BuildArmRight();
_pb->BuildLegLeft();
_pb->BuildLegRight();
}
private:
//用于保存PersonBuilder对象的指针
PersonBuilder *_pb;
};
int main()
{
//声明瘦子的实例
PersonThinBuilder *pb = new PersonThinBuilder();
//将实例传入指挥者类
PersonDirector pd(pb);
//调用创建函数
pd.CreatePerson();
return 0;
}
以下情况适用此模式(摘抄自《设计模式》):
1.当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时
2.当构造过程必须允许被构造的对象有不同的表示时.
转载请注明源地址:http://blog.youkuaiyun.com/clh01s/article/details/76423516