兴修者(生成器)模式C++、Java实现
建造者(生成器)模式C++、Java实现
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