设计模式之——建造者模式

建造者模式在抽象类的构造上有点像模板方法,类方法是在父类中构造的而非子类继承重写,首先以最常用的类开始:

  1 package Jianzaozhe;
  2 
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 
  6 public class Client {
  7     public static void main(String[] args) {
  8         BenzModel benzModel = new BenzModel();
  9         ArrayList<String>sequence = new ArrayList<>();
 10         sequence.add("engine boom");
 11         sequence.add("start");
 12         sequence.add("stop");
 13         benzModel.setSequence(sequence);
 14         benzModel.run();
 15     }
 16 }
 17 
 18 abstract class CarModel {
 19     private List<String> sequence = new ArrayList<>();
 20 
 21     protected abstract void start();
 22 
 23     protected abstract void stop();
 24 
 25     protected abstract void alarm();
 26 
 27     protected abstract void engineBoom();
 28 
 29     final public void run() {
 30         for (int i = 0; i < this.sequence.size(); i++) {
 31             String actionName = this.sequence.get(i);
 32             if (actionName.equalsIgnoreCase("start")) {
 33                 this.start(); // 开启汽车
 34             } else if (actionName.equalsIgnoreCase("stop")) {
 35                 this.stop(); // 停止汽车
 36             } else if (actionName.equalsIgnoreCase("alarm")) {
 37                 this.alarm(); // 喇叭开始叫了
 38             } else if (actionName.equalsIgnoreCase("engine boom")) { // 如果是engine
 39                                                                         // boom关键字
 40                 this.engineBoom(); // 引擎开始轰鸣
 41             }
 42         }
 43     }
 44 
 45     public List<String> getSequence() {
 46         return sequence;
 47     }
 48 
 49     public void setSequence(List<String> sequence) {
 50         this.sequence = sequence;
 51     }
 52 
 53 }
 54 
 55 class BenzModel extends CarModel {
 56 
 57     @Override
 58     protected void start() {
 59         // TODO Auto-generated method stub
 60         System.out.println("奔驰开始了...");
 61     }
 62 
 63     @Override
 64     protected void stop() {
 65         // TODO Auto-generated method stub
 66         System.out.println("奔驰停止了...");
 67     }
 68 
 69     @Override
 70     protected void alarm() {
 71         // TODO Auto-generated method stub
 72         System.out.println("奔驰按喇叭...");
 73     }
 74 
 75     @Override
 76     protected void engineBoom() {
 77         // TODO Auto-generated method stub
 78         System.out.println("奔驰引擎开启...");
 79     }
 80 
 81 }
 82 
 83 class BMWModel extends CarModel {
 84     @Override
 85     protected void start() {
 86         // TODO Auto-generated method stub
 87         System.out.println("宝马开始了...");
 88     }
 89 
 90     @Override
 91     protected void stop() {
 92         // TODO Auto-generated method stub
 93         System.out.println("宝马停止了...");
 94     }
 95 
 96     @Override
 97     protected void alarm() {
 98         // TODO Auto-generated method stub
 99         System.out.println("宝马按喇叭...");
100     }
101 
102     @Override
103     protected void engineBoom() {
104         // TODO Auto-generated method stub
105         System.out.println("宝马引擎开启...");
106     }
107 }

测试结果:

奔驰引擎开启...
奔驰开始了...
奔驰停止了...

 

2

在Client类中可以选择我们要执行的动作的顺序,但是具体到每一个动作我们都要重新装配一遍,这样太麻烦了,我们可以为每个模型定义一个装配类,由它来定义子类东走执行的顺序:

 1 abstract class CarBuilder{
 2     public abstract void setSequence(List<String> sequence);
 3     public abstract CarModel getCarModel();
 4 }
 5 
 6 class BenzBuilder extends CarBuilder{
 7 
 8     private BenzModel benzModel = new BenzModel();
 9     @Override
10     public void setSequence(List<String> sequence) {
11         // TODO Auto-generated method stub
12         this.benzModel.setSequence(sequence);
13     }
14 
15     @Override
16     public CarModel getCarModel() {
17         // TODO Auto-generated method stub
18         return this.benzModel;
19     }
20     
21 }
22 
23 class BMWBuilder extends CarBuilder{
24     private BMWModel bmwModel = new BMWModel();
25 
26     @Override
27     public void setSequence(List<String> sequence) {
28         // TODO Auto-generated method stub
29         this.bmwModel.setSequence(sequence);
30     }
31 
32     @Override
33     public CarModel getCarModel() {
34         // TODO Auto-generated method stub
35         return this.bmwModel;
36     }
37     
38 }

修改Client

 1 public class Client{
 2     public static void main(String[] args) {
 3         List<String>sequence = new ArrayList<>();
 4         sequence.add("engine boom");
 5         sequence.add("start");
 6         sequence.add("stop");
 7         
 8         BenzBuilder benzBuilder = new BenzBuilder();
 9         benzBuilder.setSequence(sequence);
10         BenzModel benzModel = (BenzModel)benzBuilder.getCarModel();
11         benzModel.run();
12         
13         BMWBuilder bmwBuilder = new BMWBuilder();
14         bmwBuilder.setSequence(sequence);
15         BMWModel bmwModel = (BMWModel)bmwBuilder.getCarModel();
16         bmwModel.run();
17     }
18 }

测试结果:

奔驰引擎开启...
奔驰开始了...
奔驰停止了...
宝马引擎开启...
宝马开始了...
宝马停止了...

 

3

上面利用Builder对getModel和getSequence两个方法进行了封装,对于未知顺序的类我们还是无法改变,这时就要利用导演类Director了:

 1 class Director{
 2     private List<String>sequence = new ArrayList<>();
 3     private BenzBuilder benzBuilder = new BenzBuilder();
 4     private BMWBuilder bmwBuilder = new BMWBuilder();
 5     
 6     public BenzModel getABenzModel(){
 7         this.sequence.clear();
 8         this.sequence.add("start");
 9         this.sequence.add("stop");
10         this.benzBuilder.setSequence(sequence);
11         return (BenzModel)this.benzBuilder.getCarModel();
12     }
13     
14     public BenzModel getBBenzModel(){
15         this.sequence.clear();
16         this.sequence.add("engine boom");
17         this.sequence.add("alarm");
18         this.benzBuilder.setSequence(sequence);
19         return (BenzModel)this.benzBuilder.getCarModel();
20     }
21     
22     public BMWModel getABmwModel(){
23         this.sequence.clear();
24         this.sequence.add("start");
25         this.sequence.add("stop");
26         this.bmwBuilder.setSequence(sequence);
27         return (BMWModel)this.bmwBuilder.getCarModel();
28     }
29     
30     public BMWModel getBBmwModel(){
31         this.sequence.clear();
32         this.sequence.add("engine boom");
33         this.sequence.add("alarm");
34         this.benzBuilder.setSequence(sequence);
35         return (BMWModel)this.bmwBuilder.getCarModel();
36     }
37 }

修改Client

 1 public class Client{
 2     public static void main(String[] args) {
 3         Director director = new Director();
 4         for (int i = 0; i < 5; i++) {
 5             director.getABenzModel().run();
 6         }
 7         for (int i = 0; i < 5; i++) {
 8             director.getBBenzModel().run();
 9         }
10         for (int i = 0; i < 5; i++) {
11             director.getABmwModel().run();
12         }
13         for (int i = 0; i < 5; i++) {
14             director.getBBmwModel().run();
15         }
16     }
17 }

测试结果:

奔驰开始了...
奔驰停止了...
奔驰开始了...
奔驰停止了...
奔驰开始了...
奔驰停止了...
奔驰开始了...
奔驰停止了...
奔驰开始了...
奔驰停止了...
奔驰引擎开启...
奔驰按喇叭...
奔驰引擎开启...
奔驰按喇叭...
奔驰引擎开启...
奔驰按喇叭...
奔驰引擎开启...
奔驰按喇叭...
奔驰引擎开启...
奔驰按喇叭...
宝马开始了...
宝马停止了...
宝马开始了...
宝马停止了...
宝马开始了...
宝马停止了...
宝马开始了...
宝马停止了...
宝马开始了...
宝马停止了...
宝马引擎开启...
宝马按喇叭...
宝马引擎开启...
宝马按喇叭...
宝马引擎开启...
宝马按喇叭...
宝马引擎开启...
宝马按喇叭...
宝马引擎开启...
宝马按喇叭...

 

所有代码如下:

  1 package Jianzaozhe;
  2 
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 
  6 /*public class Client {
  7     public static void main(String[] args) {
  8         BenzModel benzModel = new BenzModel();
  9         List<String>sequence = new ArrayList<>();
 10         sequence.add("engine boom");
 11         sequence.add("start");
 12         sequence.add("stop");
 13         benzModel.setSequence(sequence);
 14         benzModel.run();
 15     }
 16 }*/
 17 
 18 /*public class Client{
 19     public static void main(String[] args) {
 20         List<String>sequence = new ArrayList<>();
 21         sequence.add("engine boom");
 22         sequence.add("start");
 23         sequence.add("stop");
 24         
 25         BenzBuilder benzBuilder = new BenzBuilder();
 26         benzBuilder.setSequence(sequence);
 27         BenzModel benzModel = (BenzModel)benzBuilder.getCarModel();
 28         benzModel.run();
 29         
 30         BMWBuilder bmwBuilder = new BMWBuilder();
 31         bmwBuilder.setSequence(sequence);
 32         BMWModel bmwModel = (BMWModel)bmwBuilder.getCarModel();
 33         bmwModel.run();
 34     }
 35 }*/
 36 
 37 public class Client{
 38     public static void main(String[] args) {
 39         Director director = new Director();
 40         for (int i = 0; i < 5; i++) {
 41             director.getABenzModel().run();
 42         }
 43         for (int i = 0; i < 5; i++) {
 44             director.getBBenzModel().run();
 45         }
 46         for (int i = 0; i < 5; i++) {
 47             director.getABmwModel().run();
 48         }
 49         for (int i = 0; i < 5; i++) {
 50             director.getBBmwModel().run();
 51         }
 52     }
 53 }
 54 
 55 abstract class CarModel {
 56     private List<String> sequence = new ArrayList<>();
 57 
 58     protected abstract void start();
 59 
 60     protected abstract void stop();
 61 
 62     protected abstract void alarm();
 63 
 64     protected abstract void engineBoom();
 65 
 66     final public void run() {
 67         for (int i = 0; i < this.sequence.size(); i++) {
 68             String actionName = this.sequence.get(i);
 69             if (actionName.equalsIgnoreCase("start")) {
 70                 this.start(); // 开启汽车
 71             } else if (actionName.equalsIgnoreCase("stop")) {
 72                 this.stop(); // 停止汽车
 73             } else if (actionName.equalsIgnoreCase("alarm")) {
 74                 this.alarm(); // 喇叭开始叫了
 75             } else if (actionName.equalsIgnoreCase("engine boom")) { // 如果是engine
 76                                                                         // boom关键字
 77                 this.engineBoom(); // 引擎开始轰鸣
 78             }
 79         }
 80     }
 81 
 82     public List<String> getSequence() {
 83         return sequence;
 84     }
 85 
 86     public void setSequence(List<String> sequence) {
 87         this.sequence = sequence;
 88     }
 89 
 90 }
 91 
 92 class BenzModel extends CarModel {
 93 
 94     @Override
 95     protected void start() {
 96         // TODO Auto-generated method stub
 97         System.out.println("奔驰开始了...");
 98     }
 99 
100     @Override
101     protected void stop() {
102         // TODO Auto-generated method stub
103         System.out.println("奔驰停止了...");
104     }
105 
106     @Override
107     protected void alarm() {
108         // TODO Auto-generated method stub
109         System.out.println("奔驰按喇叭...");
110     }
111 
112     @Override
113     protected void engineBoom() {
114         // TODO Auto-generated method stub
115         System.out.println("奔驰引擎开启...");
116     }
117 
118 }
119 
120 class BMWModel extends CarModel {
121     @Override
122     protected void start() {
123         // TODO Auto-generated method stub
124         System.out.println("宝马开始了...");
125     }
126 
127     @Override
128     protected void stop() {
129         // TODO Auto-generated method stub
130         System.out.println("宝马停止了...");
131     }
132 
133     @Override
134     protected void alarm() {
135         // TODO Auto-generated method stub
136         System.out.println("宝马按喇叭...");
137     }
138 
139     @Override
140     protected void engineBoom() {
141         // TODO Auto-generated method stub
142         System.out.println("宝马引擎开启...");
143     }
144 }
145 
146 abstract class CarBuilder{
147     public abstract void setSequence(List<String> sequence);
148     public abstract CarModel getCarModel();
149 }
150 
151 class BenzBuilder extends CarBuilder{
152 
153     private BenzModel benzModel = new BenzModel();
154     @Override
155     public void setSequence(List<String> sequence) {
156         // TODO Auto-generated method stub
157         this.benzModel.setSequence(sequence);
158     }
159 
160     @Override
161     public CarModel getCarModel() {
162         // TODO Auto-generated method stub
163         return this.benzModel;
164     }
165     
166 }
167 
168 class BMWBuilder extends CarBuilder{
169     private BMWModel bmwModel = new BMWModel();
170 
171     @Override
172     public void setSequence(List<String> sequence) {
173         // TODO Auto-generated method stub
174         this.bmwModel.setSequence(sequence);
175     }
176 
177     @Override
178     public CarModel getCarModel() {
179         // TODO Auto-generated method stub
180         return this.bmwModel;
181     }
182     
183 }
184 
185 class Director{
186     private List<String>sequence = new ArrayList<>();
187     private BenzBuilder benzBuilder = new BenzBuilder();
188     private BMWBuilder bmwBuilder = new BMWBuilder();
189     
190     public BenzModel getABenzModel(){
191         this.sequence.clear();
192         this.sequence.add("start");
193         this.sequence.add("stop");
194         this.benzBuilder.setSequence(sequence);
195         return (BenzModel)this.benzBuilder.getCarModel();
196     }
197     
198     public BenzModel getBBenzModel(){
199         this.sequence.clear();
200         this.sequence.add("engine boom");
201         this.sequence.add("alarm");
202         this.benzBuilder.setSequence(sequence);
203         return (BenzModel)this.benzBuilder.getCarModel();
204     }
205     
206     public BMWModel getABmwModel(){
207         this.sequence.clear();
208         this.sequence.add("start");
209         this.sequence.add("stop");
210         this.bmwBuilder.setSequence(sequence);
211         return (BMWModel)this.bmwBuilder.getCarModel();
212     }
213     
214     public BMWModel getBBmwModel(){
215         this.sequence.clear();
216         this.sequence.add("engine boom");
217         this.sequence.add("alarm");
218         this.benzBuilder.setSequence(sequence);
219         return (BMWModel)this.bmwBuilder.getCarModel();
220     }
221 }
View Code

 

posted @ 2014-10-08 21:23  cityflickr  阅读(145)  评论(0编辑  收藏  举报