06.建造者模式--Builder

 

Builder模式:
Builder模式将一个复杂对象的构建与它的表示分离使得同样的构建过程可以创建不同的表示

当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开来,这样做的好处就是通过一步步的进行复杂对象的构建,由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。 Builder模式要解决的也正是这样的问题。

Builder模式主用用于创建一些复杂的对象,这些对象内部间的建造顺序同行是稳定的,但对象内部的构造通常面临着复杂的变化。Builder模式使得建造代码与表示代码分离,由于Builder模式隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。

《大话设计模式》中,对于Builder模式的实现代码是用的画一个人为例子,将画一个人的构建顺序分为画头,画躯干,画四肢三个过程。不同的构建产生的不同高矮胖瘦的人就是不同的产品。

而更通俗的说法是《设计模式精解-GoF 23种设计模式解析》中说的,要完成大学教育,一般将大学教育过程分成4个学期进行,因此没有学习可以看作是构建完整大学教育的一个部分构建过程,每个人经过这4年的(4个阶段)构建过程得到的最后的结果不一样,因为可能在四个阶段的构建中引入了很多的参数(每个人的机会和际遇不完全相同)。

Builder模式的典型结构图为:
 


这里以画一个人为例子,实现Buider模式,下面是实现代码:

//Product.h
#ifndef _PRODUCT_H_
#define _PRODUCT_H_

class CHuman
{
public:
 CHuman();
 ~CHuman();
protected:
private:
};

#endif //~_PRODUCT_H_

 

#include "Product.h"
#include <iostream>
using namespace std;

CHuman::CHuman()
{
 cout << "构建一个人" << endl;
}

 

//Director.h
#ifndef _DIRECTOR_H_
#define _DIRECTOR_H_

class Builder;
class Director
{
public:
 Director(Builder* bld);
 ~Director();
 void Construct();
protected:
private:
 Builder* _bld;
};

#endif //~_DIRECTOR_H_

 

//Director.cpp
#include "director.h"
#include "Builder.h"

Director::Director(Builder* bld)
{
 _bld = bld;
}

Director::~Director()
{
}

void Director::Construct()
{
 _bld->BuildHead("user-defined");
 _bld->BuildBody("user-defined");
 _bld->BuildLimbs("user-defined");
}

 

//Builder.h
#ifndef _BUILDER_H_
#define _BUILDER_H_

#include <string>
using namespace std;

class CHuman;

// 构建者
class Builder
{
public:
 virtual ~Builder();
 virtual void BuildHead(const string& buildPara) = 0;
 virtual void BuildBody(const string& buildPara) = 0;
 virtual void BuildLimbs(const string& buildPara) = 0;
 virtual CHuman* GetProduct() = 0;
protected:
 Builder();
private:
};

// 胖人的构建者
class FatManBuilder:public Builder
{
public:
 FatManBuilder();
 ~FatManBuilder();
 void BuildHead(const string& buildPara);
 void BuildBody(const string& buildPara);
 void BuildLimbs(const string& buildPara);
 CHuman* GetProduct();
protected:
private:
};

// 瘦人的构建者
class ThinManBuilder:public Builder
{
public:
 ThinManBuilder();
 ~ThinManBuilder();
 void BuildHead(const string& buildPara);
 void BuildBody(const string& buildPara);
 void BuildLimbs(const string& buildPara);
 CHuman* GetProduct();
protected:
private:
};


#endif //~_BUILDER_H_

 

//Builder.cpp
#include "Builder.h"
#include "Product.h"
#include <iostream>
using namespace std;

Builder::Builder()
{
}

Builder::~Builder()
{
}

FatManBuilder::FatManBuilder()
{
}

FatManBuilder::~FatManBuilder()
{
}

void FatManBuilder::BuildHead(const string& buildPara)
{
 cout<<"Step1:BuildHead...胖头, "<<buildPara<<endl;
}

void FatManBuilder::BuildBody(const string& buildPara)
{
 cout<<"Step2:BuildBody...胖身, "<<buildPara<<endl;
}

void FatManBuilder::BuildLimbs(const string& buildPara)
{
 cout<<"Step3:BuildLimbs...胖四肢, "<<buildPara<<endl;
}

CHuman* FatManBuilder::GetProduct()
{
 BuildHead("pre-defined");
 BuildBody("pre-defined");
 BuildLimbs("pre-defined");

 return new CHuman();
}


ThinManBuilder::ThinManBuilder()
{
}

ThinManBuilder::~ThinManBuilder()
{
}

void ThinManBuilder::BuildHead(const string& buildPara)
{
 cout<<"Step1:BuildHead...瘦头, "<<buildPara<<endl;
}

void ThinManBuilder::BuildBody(const string& buildPara)
{
 cout<<"Step2:BuildBody...瘦身, "<<buildPara<<endl;
}

void ThinManBuilder::BuildLimbs(const string& buildPara)
{
 cout<<"Step3:BuildLimbs...瘦四肢, "<<buildPara<<endl;
}

CHuman* ThinManBuilder::GetProduct()
{
 BuildHead("pre-defined");
 BuildBody("pre-defined");
 BuildLimbs("pre-defined");
 
 return new CHuman();
}

 

//main.cpp
#include "Builder.h"
#include "Product.h"
#include "Director.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
 Builder *pBuilder1 = new FatManBuilder();
 Director* d1 = new Director(pBuilder1);
 d1->Construct();

 Builder *pBuilder2 = new ThinManBuilder();
 Director* d2 = new Director(pBuilder2);
 d2->Construct();

 Builder *pBuilder3 = new FatManBuilder();
 pBuilder3->GetProduct();

 Builder *pBuilder4 = new ThinManBuilder();
 pBuilder4->GetProduct();

 return 0;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值