1、建造者模式UML 圖1. 建造者模式UML 2、C++實現 C++實現類視圖: 圖2. 建造者模式C++實現的類視圖 其中,Product的實現代碼是(ProductA和ProductB的代碼不再列出): Builder實現代碼是: ConcreteBuilderA的實現代碼是: Concret ...
1、建造者模式UML
圖1. 建造者模式UML
2、C++實現
C++實現類視圖:
圖2. 建造者模式C++實現的類視圖
其中,Product的實現代碼是(ProductA和ProductB的代碼不再列出):
1 //產品抽象基類。 2 //三個屬性的先後賦值順序代表著不同產品的建立。 3 class Product 4 { 5 private: 6 std::string attribute1; 7 std::string attribute2; 8 std::string attribute3; 9 10 public: 11 Product(); 12 ~Product(); 13 };
Builder實現代碼是:
1 //建造者抽象基類。 2 class Builder 3 { 4 public: 5 Builder(); 6 ~Builder(); 7 8 //聲明的3個為Product的三個屬性賦值的函數。 9 virtual void OperateStep1() = 0; 10 virtual void OperateStep2() = 0; 11 virtual void OperateStep3() = 0; 12 13 //返回建立好的Product對象。 14 virtual Product * GetResult() = 0; 15 16 };
ConcreteBuilderA的實現代碼是:
1 class ConcreteBuilderA : 2 public Builder 3 { 4 private: 5 ProductA * pa; 6 7 public: 8 ConcreteBuilderA() { pa = new ProductA();} 9 ~ConcreteBuilderA(); 10 11 //函數中是賦值語句,可按具體的產品對象的賦值順序賦值。 12 void OperateStep1() { pa->setAttribute1(""); } 13 void OperateStep2() { pa->setAttribute2(""); } 14 void OperateStep3() { pa->setAttribute3(""); } 15 16 //返回建立好的ProductA對象。 17 Product * GetResult() { return pa; } 18 };
ConcreteBuilderB的實現代碼是:
1 //具體建造者類,建立ProductB的對象,併為ProductB的屬性賦值。 2 class ConcreteBuilderB : 3 public Builder 4 { 5 private: 6 ProductB * pb; 7 8 public: 9 ConcreteBuilderB() { pb = new ProductB(); } 10 ~ConcreteBuilderB(); 11 12 //函數中是賦值語句,可按具體的產品對象的賦值順序賦值。 13 void OperateStep1() { pb->setAttribute3(""); } 14 void OperateStep2() { pb->setAttribute2(""); } 15 void OperateStep3() { pb->setAttribute1(""); } 16 17 //返回建立好的ProductA對象。 18 Product * GetResult() { return pb; } 19 20 };
Director的實現代碼是:
1 //建造者模式中的監督類。 2 //向外提供介面,向內定義建造順序。 3 class Director 4 { 5 private: 6 Builder * builder; 7 8 public: 9 //按得到的不同的對象,進行不同順序的建造。 10 Director(Builder &b); 11 ~Director(); 12 13 //具體的監督方法。 14 Product * GetResult(); 15 }; 16 17 18 Director::Director(Builder &b) 19 { 20 builder = &b; 21 } 22 23 //方法中的調用順序固定,建造順序可在不同的Builder對象設置。 24 Product * Director::GetResult() 25 { 26 builder->OperateStep1(); 27 builder->OperateStep2(); 28 builder->OperateStep3(); 29 30 return builder->GetResult(); 31 }//end method GetResult
3、Java實現
Java實現的類視圖
圖3. 建造者模式的Java實現的類視圖
其中,Product的實現代碼是(ProductA和ProductB的代碼不再列出):
1 public class Product { 2 3 private String attribute1; 4 private String attribute2; 5 private String attribute3; 6 7 }//end class Product
Builder的實現代碼是:
1 public abstract class Builder { 2 3 //三個為產品屬性賦值的方法。 4 //三個方法按相應產品必要的順序賦值。 5 public abstract void OperateStep1(); 6 public abstract void OperateStep2(); 7 public abstract void OperateStep3(); 8 9 //一個返回具體產品對象的方法。 10 public abstract Product GetResult(); 11 12 }//end class Builder
ConcreteBuilderA的實現代碼是:
1 //具體建造者,負責生產ProductA的對象。 2 public class ConcreteBuilderA extends Builder { 3 4 private ProductA pa; 5 6 public ConcreteBuilderA() { 7 // TODO Auto-generated constructor stub 8 this.pa = new ProductA(); 9 }//end method ConcreteBuilderA 10 11 //為產品A中的屬性attribute1賦值。 12 @Override 13 public void OperateStep1() { 14 // TODO Auto-generated method stub 15 this.pa.setAttribute1("這是ProductA的屬性attribute1的值:A1"); 16 17 System.out.println(this.pa.getAttribute1()); 18 }//end method OperateStep1 19 20 //為產品A中的屬性attribute2賦值。 21 @Override 22 public void OperateStep2() { 23 // TODO Auto-generated method stub 24 this.pa.setAttribute2("這是ProductA的屬性attribute2的值:A2"); 25 26 System.out.println(this.pa.getAttribute2()); 27 }//end method OperateStep2 28 29 //為產品A中的屬性attribute3賦值。 30 @Override 31 public void OperateStep3() { 32 // TODO Auto-generated method stub 33 this.pa.setAttribute3("這是ProductA的屬性attribute3的值:A3"); 34 35 System.out.println(this.pa.getAttribute3()); 36 }//end method OperateStep3 37 38 //返回建立好的ProductA的對象。 39 @Override 40 public Product GetResult() { 41 // TODO Auto-generated method stub 42 return this.pa; 43 }//end method GetResult 44 45 }//end class ConcreteBuilderA
ConcreteBuilderB的實現代碼是:
1 //具體建造者,負責生產ProductB的對象。 2 public class ConcreteBuilderB extends Builder { 3 4 private ProductB pb; 5 6 public ConcreteBuilderB() { 7 // TODO Auto-generated constructor stub 8 this.pb = new ProductB(); 9 }//end method ConcreteBuilderB 10 11 //為產品B中的屬性attribute3賦值。 12 @Override 13 public void OperateStep1() { 14 // TODO Auto-generated method stub 15 this.pb.setAttribute3("這是ProductB的屬性attribute3的值:B1"); 16 17 System.out.println(this.pb.getAttribute3()); 18 }//end method OperateStep1 19 20 //為產品B中的屬性attribute2賦值。 21 @Override 22 public void OperateStep2() { 23 // TODO Auto-generated method stub 24 this.pb.setAttribute2("這是ProductB的屬性attribute2的值:B2"); 25 26 System.out.println(this.pb.getAttribute2()); 27 }//end method OperateStep2 28 29 //為產品B中的屬性attribute1賦值。 30 @Override 31 public void OperateStep3() { 32 // TODO Auto-generated method stub 33 this.pb.setAttribute1("這是ProductB的屬性attribute1的值:B3"); 34 35 System.out.println(this.pb.getAttribute1()); 36 }//end method OperateStep3 37 38 //返回建立好的ProductB的對象。 39 @Override 40 public Product GetResult() { 41 // TODO Auto-generated method stub 42 return this.pb; 43 }//end method GetResult 44 45 }//end class ConcreteBuilderB
Director的實現代碼是:
1 //監督者,負責對外介面,按一定順序調用Builder中的三個為Product產品屬性賦值方法。 2 public class Director { 3 4 private Builder builder; 5 6 public Director(Builder builder) { 7 // TODO Auto-generated constructor stub 8 this.builder = builder; 9 }//end method Director 10 11 //調用三個賦值方法,並返回建造結果。 12 public Product GetResult() { 13 this.builder.OperateStep1(); 14 this.builder.OperateStep2(); 15 this.builder.OperateStep3(); 16 17 return this.builder.GetResult(); 18 }//end method GetResult 19 20 }//end method Director