博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

builder 建造模式

Posted on 2015-04-07 14:37  bw_0927  阅读(116)  评论(0)    收藏  举报

http://www.cnblogs.com/my_life/articles/4464980.html

跟模板模式有点类似

 

在这里我想到一个比较形象的例子:

比如我某天去吃兰州拉面,他们有不同的套餐,套餐里包含的种类是一样的,都有一
碗拉面,一份泡菜,一杯饮料。但是不同的套餐里这3样又都不是全部一样的,也许分量和品质有差别。此时我们就可以用建造者模式。

这里我没有合适的UML图,大致说一下模型:客户根据套餐不同,跟收银员点了一份A套餐的拉面,另一名客户同时又点了一份B套餐的拉面,

这时收银员把这两个单子转交给后台,其实也就是厨房,厨师看到这两个单子的不同而煮不同的拉面,然后返回给服务员,服务员分发拉面给客户!

 

1.建造者(B u i l d e r)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。


2.具体建造者(Co n cre te   B u i l d e r)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创
建产品实例。


3.指导者(D i re cto r)角色:担任这个角色的类调用具体建造者角色以创建产品对象。是收银员,他知道我想要什么套餐,他会告诉里面的
店员工去准备什么套餐。

 

====================================

 

 

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

 

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

 

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

 

结构如下:

 

 

Builder:为最基本的生产步骤

 

KFCBuilder:为KFC的具体生产步骤

 

MCDBuilder:为Mcdonalds的具体生产步骤

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

//////////////////////////////////////////////////////////////////////////
//建造者
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:"<<endl;
    }

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

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

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

};

//Mcdonalds 具体建造者
class MCDBuilder:public Builder
{
public:
    void BuildSetp1()
    {
        cout<<"Mcdonalds Step1:"<<endl;
    }
    
    void BuildSetp2()
    {
        cout<<"Mcdonalds Step2:"<<endl;
    }
    
    void BuildSetp3()
    {
        cout<<"Mcdonalds Step3:"<<endl;
    }
    
    void BuildSetp4()
    {
        cout<<"Mcdonalds Step4:"<<endl;
    }
    
};

//////////////////////////////////////////////////////////////////////////
//指挥者
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. 建造者模式,在建造顺序上通常是稳定的。

2. 指挥者(Director),来隔离用户与具体建造过程的关联。

3. 它的好处是,客户端不需要知道具体的建造者方法,也不用但心忘记某一步骤没写,这些步骤统一由Director来调用。

 

===================================

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

#include <iostream>
using namespace std;

class Builder
{
public:
	virtual void BulidPartOne()
	{}
	virtual void BuildPartTwo()
	{}
};

class ConcreteBuilder1:public Builder
{
public:
	void BulidPartOne()
	{
		cout<<"Product One:Build Part One..."<<endl;
	}
	void BuildPartTwo()
	{
		cout<<"Product One:Build Part Two..."<<endl;
	}
};

class ConcreteBuilder2:public Builder
{
public:
	void BulidPartOne()
	{
		cout<<"Product Two:Build Part One..."<<endl;
	}
	void BuildPartTwo()
	{
		cout<<"Product Two:Build Part One..."<<endl;
	}
};

class Director
{
public:
	void Construct(Builder *builder)
	{
		builder->BulidPartOne();
		builder->BuildPartTwo();
	}
};

int main()
{
	ConcreteBuilder1 *builder1 = new ConcreteBuilder1();
	ConcreteBuilder2 *builder2 = new ConcreteBuilder2();

	Director *director = new Director();
	
	director->Construct(builder1);
	director->Construct(builder2);

	delete builder1;
	delete builder2;
	delete director;

	system("pause");
	return 0;
}