首页 > 代码库 > 设计模式之——建造者模式

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

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

  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     @Override103     protected void engineBoom() {104         // TODO Auto-generated method stub105         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     @Override10     public void setSequence(List<String> sequence) {11         // TODO Auto-generated method stub12         this.benzModel.setSequence(sequence);13     }14 15     @Override16     public CarModel getCarModel() {17         // TODO Auto-generated method stub18         return this.benzModel;19     }20     21 }22 23 class BMWBuilder extends CarBuilder{24     private BMWModel bmwModel = new BMWModel();25 26     @Override27     public void setSequence(List<String> sequence) {28         // TODO Auto-generated method stub29         this.bmwModel.setSequence(sequence);30     }31 32     @Override33     public CarModel getCarModel() {34         // TODO Auto-generated method stub35         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     @Override101     protected void stop() {102         // TODO Auto-generated method stub103         System.out.println("奔驰停止了...");104     }105 106     @Override107     protected void alarm() {108         // TODO Auto-generated method stub109         System.out.println("奔驰按喇叭...");110     }111 112     @Override113     protected void engineBoom() {114         // TODO Auto-generated method stub115         System.out.println("奔驰引擎开启...");116     }117 118 }119 120 class BMWModel extends CarModel {121     @Override122     protected void start() {123         // TODO Auto-generated method stub124         System.out.println("宝马开始了...");125     }126 127     @Override128     protected void stop() {129         // TODO Auto-generated method stub130         System.out.println("宝马停止了...");131     }132 133     @Override134     protected void alarm() {135         // TODO Auto-generated method stub136         System.out.println("宝马按喇叭...");137     }138 139     @Override140     protected void engineBoom() {141         // TODO Auto-generated method stub142         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     @Override155     public void setSequence(List<String> sequence) {156         // TODO Auto-generated method stub157         this.benzModel.setSequence(sequence);158     }159 160     @Override161     public CarModel getCarModel() {162         // TODO Auto-generated method stub163         return this.benzModel;164     }165     166 }167 168 class BMWBuilder extends CarBuilder{169     private BMWModel bmwModel = new BMWModel();170 171     @Override172     public void setSequence(List<String> sequence) {173         // TODO Auto-generated method stub174         this.bmwModel.setSequence(sequence);175     }176 177     @Override178     public CarModel getCarModel() {179         // TODO Auto-generated method stub180         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

 

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