The builder mode defines a specific object and is a collection of various attributes. To create an object, you can create a constructor that contains a specific constructor, but only provides one interface. The detailed constructor is implemented in a derived class.
Builder. H Content
1 #ifndef Builder_H_H 2 #define Builder_H_H 3 4 #include <iostream> 5 #include <string> 6 #include <vector> 7 using namespace std; 8 9 class Product 10 { 11 public: 12 Product() {} 13 void display(){ 14 //cout << vecStr.size() << endl; 15 for(size_t i=0; i<vecStr.size(); ++i){ 16 cout << vecStr[i] << " "; 17 } 18 cout << endl; 19 } 20 void addItem(string str) { vecStr.push_back(str); } 21 private: 22 vector<string> vecStr; 23 }; 24 25 class Builder 26 { 27 public: 28 Builder() {} 29 virtual Product* getProduct() = 0; 30 void Build(){ 31 buildItem1(); 32 buildItem2(); 33 } 34 virtual void buildItem1() = 0; 35 virtual void buildItem2() = 0; 36 virtual ~Builder() {} 37 }; 38 39 40 class BuilderOne : public Builder 41 { 42 public: 43 BuilderOne() { product = new Product(); } 44 virtual void buildItem1() { product->addItem("First"); } 45 virtual void buildItem2() { product->addItem("Second"); } 46 virtual Product* getProduct() { return product; } 47 void release(){ 48 if(product != NULL){ 49 delete product; 50 product = NULL; 51 } 52 } 53 virtual ~BuilderOne() { release(); } 54 private: 55 Product *product; 56 }; 57 58 class BuilderTwo : public Builder 59 { 60 public: 61 BuilderTwo() { product = new Product(); } 62 virtual void buildItem1() { product->addItem("A"); } 63 virtual void buildItem2() { product->addItem("B"); } 64 virtual Product* getProduct() { return product; } 65 void release(){ 66 if(product != NULL){ 67 delete product; 68 product = NULL; 69 } 70 } 71 virtual ~BuilderTwo() { release(); } 72 private: 73 Product *product; 74 }; 75 76 class Direct 77 { 78 public: 79 Direct() : builder(NULL) {} 80 void setBuilder(Builder *builder0){ 81 release(); 82 builder = builder0; 83 } 84 void Build(){ 85 builder->Build(); 86 } 87 Product* getProduct() { return builder->getProduct(); } 88 void release(){ 89 if(builder != NULL){ 90 delete builder; 91 builder = NULL; 92 } 93 } 94 ~Direct() { release(); } 95 private: 96 Builder *builder; 97 }; 98 99 void BuilderTest()100 {101 Builder *builder1 = new BuilderOne();102 Builder *builder2 = new BuilderTwo();103 Direct *direct = new Direct();104 105 direct->setBuilder(builder1);106 direct->Build();107 direct->getProduct()->display();108 109 direct->setBuilder(builder2);110 direct->Build();111 direct->getProduct()->display();112 113 delete direct;114 }115 116 #endif
Running result:
Design Mode 8-builder Mode