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


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

      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
  • 相关阅读:
    找工作刷题-------->Java相关
    ElasticSearch--------->批量索引------->推荐方法、注意事项、性能优化
    ElasticSearch--------------------->索引设计--------------------->数据库数据迁移至ES,如何根据tables特点设计ES的index/type/shards数目?
    Oracle------------->PL/SQL---------------->连接oracle数据库
    责任链模式
    程序员必备软件
    反射
    Linux 磁盘扩容
    1.4 java8 LocalDate
    观察者模式
  • 原文地址:https://www.cnblogs.com/cityflickr/p/4012083.html
Copyright © 2020-2023  润新知