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; }