建造者模式:将一个复杂对象的构建与它的表示分离,是的同样的构建过程可以创建不同的表示。
说白了,就是 不同对象的表现不同(如 香辣鸡腿堡、虾堡等),但创建流程是相同的(如 烤汉堡的流程相同),那么将创建流程进行抽象。目的是防止某个对象创建时缺失某个步骤,导致对象不完整(如新增奥尔良鸡腿堡,创建时,忘记放沙拉酱)。使用建造者模式,保证了建造流程的稳定,在具体子类中实现流程中各个环节的特殊变化。
一、UML结构图
二、建造胖人、瘦人示例
建造胖人、瘦人时,头、胳膊、腿各个流程相对稳定,但是胖瘦不稳定。
1 #include <iostream> 2 #include <vector> 3 #include <string> 4 5 using namespace std; 6 //Product类 7 class Product 8 { 9 vector<string> parts; 10 public: 11 void Add(const string part) 12 { 13 parts.push_back(part); 14 } 15 void Show()const 16 { 17 for(int i = 0 ; i < parts.size() ; i++) 18 { 19 cout<<parts[i]<<endl; 20 } 21 } 22 }; 23 //抽象builder类 24 class Builder 25 { 26 public: 27 virtual void BuildHead() = 0; 28 virtual void BuildBody() = 0; 29 virtual void BuildHand() = 0; 30 virtual void BuildFeet() = 0; 31 virtual Product GetResult() = 0; 32 }; 33 //具体胖人创建类 34 class FatPersonBuilder :public Builder 35 { 36 private: 37 Product product; 38 public: 39 virtual void BuildHead() 40 { 41 product.Add("胖人头");//创建瘦人的头 42 } 43 virtual void BuildBody() 44 { 45 product.Add("胖人身体");//创建瘦人的身体 46 } 47 virtual void BuildHand() 48 { 49 product.Add("胖人手");//创建瘦人的手 50 } 51 virtual void BuildFeet() 52 { 53 product.Add("胖人脚");//创建瘦人的脚 54 } 55 virtual Product GetResult() 56 { 57 return product; 58 } 59 }; 60 //具体瘦人人创建类 61 class ThinPersonBuilder :public Builder 62 { 63 private: 64 Product product; 65 public: 66 virtual void BuildHead() 67 { 68 product.Add("瘦人人头");//创建瘦人的头 69 } 70 virtual void BuildBody() 71 { 72 product.Add("瘦人身体");//创建瘦人的身体 73 } 74 virtual void BuildHand() 75 { 76 product.Add("瘦人手");//创建瘦人的手 77 } 78 virtual void BuildFeet() 79 { 80 product.Add("瘦人脚");//创建瘦人的脚 81 } 82 virtual Product GetResult() 83 { 84 return product; 85 } 86 }; 87 //Director类 88 class Director 89 { 90 public: 91 void Construct(Builder &builder) 92 { 93 builder.BuildHead(); 94 builder.BuildBody(); 95 builder.BuildHand(); 96 builder.BuildFeet(); 97 } 98 }; 99 100 int main() 101 { 102 Director *director = new Director(); 103 Builder *b1 = new FatPersonBuilder(); 104 Builder *b2 = new ThinPersonBuilder(); 105 106 director->Construct(*b1); 107 Product p1 = b1->GetResult(); 108 p1.Show(); 109 return 0; 110 }