建造者(生成器)模式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

 

4、点击此处下载源码

转载于:https://www.cnblogs.com/minbaba/p/6368529.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值