首页 > 代码库 > 【设计模式】建造者模式

【设计模式】建造者模式

 

设计模式 之 建造者模式

 

//建造者模式

/************************************************************************
【建造者】提供了建造动作的接口

【具体建造者】去实现【建造者】的每个接口,对每个【具体建造者】来说,
 创建【产品】的步骤相同,不同的只是“细节”

【产品】即每个【具体建造者】的实例

【指挥者】中去调用创建【产品】的每个接口,利用多台性质去调用每个【具体建造者】
实现的接口。

--------------------------------------------------------------------------

本文以生产不同型号的手机为例来说明,一个品牌的手机都有许多【型号】,这里的
不同【型号】即为不同的【具体创建者】,不同【型号】的手机只是“配置”不同,
生产手机的过程是相同的,[装主板]、[装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函数中调用一系列组装函数时,感觉有点类似于前面的【外观模式】,又感觉有区别,

外观模式中:【外观】类中提供了一些列函数,这些函数是对各个【子系统】的函数调用的封装,或者个数不同,或者顺序不同,并没有一个各个子系统的“基类”,也没有用到【多态】性质;

建造者模式中:【建造者】首先是一个基类,他的多个子类(即【具体建造者】)是对该【建造者】类中的接口的不同实现,而各个子类在创建对象的时候,对这些接口(动作或操作)的步骤/调用顺序/流程 是相同的, 然后依赖于【指挥者】类中的不同输入,根据多态性质去调用不同的子类中的各个操作(去接口的实现)。