建造者模式:将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创造不同的表示。
1 // builder.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 #include <list> 7 #include <string> 8 using namespace std; 9 10 class Hamburger{ 11 12 private: 13 list<string> strList ; 14 public: 15 void addPart(string part){ 16 strList.push_back(part); 17 } 18 void show(){ 19 list<string>::iterator listit; 20 for(listit=strList.begin();listit!=strList.end();listit++){ 21 cout << *listit << endl; 22 } 23 } 24 }; 25 26 class HamBulider{ 27 28 public: 29 virtual void bulidPartA()=0; 30 virtual void bulidPartB()=0; 31 virtual void bulidPartC()=0; 32 virtual Hamburger *getProduce()=0; 33 }; 34 class ConcreteHamBulider:public HamBulider{ 35 36 private : 37 Hamburger *h; 38 string a;//麻辣 39 string b;//辣 40 string c;//不辣 41 public: 42 ConcreteHamBulider(string a,string b,string c){ 43 this->a = a; 44 this->b = b; 45 this->c = c; 46 h = new Hamburger(); 47 } 48 void bulidPartA(){ 49 cout << "面包"<<a<<endl; 50 } 51 void bulidPartB(){ 52 cout << "鸡肉"<<b<<endl; 53 } 54 void bulidPartC(){ 55 cout << "面包"<<c<<endl; 56 } 57 Hamburger *getProduce(){ 58 return h; 59 } 60 61 }; 62 63 class Director{ 64 public: 65 void Construct(HamBulider *hb){ 66 hb->bulidPartA(); 67 hb->bulidPartB(); 68 hb->bulidPartC(); 69 } 70 }; 71 int _tmain(int argc, _TCHAR* argv[]) 72 { 73 HamBulider *cHamBulider1 = new ConcreteHamBulider("不辣","不辣","不辣"); 74 Director *d = new Director(); 75 d->Construct(cHamBulider1); 76 77 Hamburger *h1 = cHamBulider1->getProduce(); 78 h1->show(); 79 80 HamBulider *cHamBulider2 = new ConcreteHamBulider("辣","辣","辣"); 81 d->Construct(cHamBulider2); 82 83 Hamburger *h2 = cHamBulider2->getProduce(); 84 h2->show(); 85 return 0; 86 }
建造者应用场景:主要用于创造一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。建造者模式可以使建造代码与表示代码分离,由于建造者模式隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
建造者模式实在创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式所适用的模式。
由以上例子分析。Hamburg的制造流程是固定不变的,即从上到下:面包-鸡肉-面包;我们只需要定义 面包,鸡肉,面包的口味。口味的确定需要具体的HamburgBulider来确定,由Director来完成制作流程,这样不会因为失误造成 鸡肉-面包-面包的错误情况。