设计模式C++描述----07.建造者(Builder)模式(一)

2014-11-24 12:03:55 · 作者: · 浏览: 3

一. 概述


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

二. 举例

KFC 与 Mcdonalds 的汉堡生成过程大致都是一样的,假设分为4个步骤;

但是 KFC 与 Mcdonalds 的汉堡味道有所差别,主要是在每一步的细节上有所不同。

顾客要吃汉堡并不关心具体的生产步骤,其实汉堡店也不关心,因为数百年来,这些步骤者是相同的,差别只在细节上。比如盐放多少,辣椒放多少等等。

结构如下:

\

Builder:为最基本的生产步骤

KFCBuilder:为KFC的具体生产步骤

MCDBuilder:为Mcdonalds的具体生产步骤

Director:为指挥者,用它来控件建造过程


[cpp] //////////////////////////////////////////////////////////////////////////
//建造者
class Builder
{
public:
virtual ~Builder()
{
}

virtual void BuildSetp1() = 0;
virtual void BuildSetp2() = 0;
virtual void BuildSetp3() = 0;
virtual void BuildSetp4() = 0;
};

//KFC 具体建造者
class KFCBuilder:public Builder
{
public:
void BuildSetp1()
{
cout<<"KFC Step1:"< }

void BuildSetp2()
{
cout<<"KFC Step2:"< }

void BuildSetp3()
{
cout<<"KFC Step3:"< }

void BuildSetp4()
{
cout<<"KFC Step4:"< }

};

//Mcdonalds 具体建造者
class MCDBuilder:public Builder
{
public:
void BuildSetp1()
{
cout<<"Mcdonalds Step1:"< }

void BuildSetp2()
{
cout<<"Mcdonalds Step2:"< }

void BuildSetp3()
{
cout<<"Mcdonalds Step3:"< }

void BuildSetp4()
{
cout<<"Mcdonalds Step4:"< }

};

//////////////////////////////////////////////////////////////////////////
//指挥者
class Director
{
private:
Builder *m_pBuilder;

public:
Director(Builder *builder)
{
m_pBuilder = builder;
}

void Create()
{
m_pBuilder->BuildSetp1();
m_pBuilder->BuildSetp2();
m_pBuilder->BuildSetp3();
m_pBuilder->BuildSetp4();
}
};


//////////////////////////////////////////////////////////////////////////
//测试代码
int main(int argc,char* argv[])
{
KFCBuilder kfc; //想吃KFC

Director director(&kfc);
director.Create();

return 0;
}
//////////////////////////////////////////////////////////////////////////
//建造者
class Builder
{
public:
virtual ~Builder()
{
}

virtual void BuildSetp1() = 0;
virtual void BuildSetp2() = 0;
virtual void BuildSetp3() = 0;
virtual void BuildSetp4() = 0;
};

//KFC 具体建造者
class KFCBuilder:public Builder
{
public:
void BuildSetp1()
{
cout<<"KFC Step1:"< }

void BuildSetp2()
{
cout<<"KFC Step2:"< }

void BuildSetp3()
{
cout<<"KFC Step3:"< }

void BuildSetp4()
{
cout<<"KFC Step4:"< }

};

//Mcdonalds 具体建造者
class MCDBuilder:public Builder
{
public:
void BuildSetp1()
{
cout<<"Mcdonalds Step1:"< }

void BuildSetp2()
{
cout<<"Mcdonalds Step2:"< }

void BuildSetp3()
{
cout<<"Mcdonalds Step3:"< }

void BuildSetp4()
{
cout<<"Mcdonalds Step4:"< }

};

//////////////////////////////////////////////////////////////////////////
//指挥者
class Director
{
private:
Builder *m_pBuilder;

public:
Director(Builder *builder)
{
m_pBuilder = builder;
}

void Create()
{
m_pBuilder->BuildSetp1();
m_pBuilder->BuildSetp2();
m_pBuilder->BuildSetp3();
m_pBuilder->BuildSetp4();
}
};


//////////////////////////////////////////////////////////////////////////
//测试代码
int main(int argc,char* argv[])
{
KFCBuilder kfc; //想吃KFC

Director director(&kfc);
director.Create();

return 0;
}
三. 说明

1. 建造者