设计模式-----建造者模式

来源:互联网 发布:js一个函数执行完成 编辑:程序博客网 时间:2024/06/07 10:27

建造者模式

建造者模式的定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

这里写图片描述

  • Director导演类—–负责安排已有的模块的顺序,然后通知builder进行构建
  • ConcreteBuilder具体建造者——实现抽象类的所有方法,返回一个组件好的对象
  • Product产品类——–具体的产品类
  • Builder抽象建造者——-规范建造者的规范

建造者模式的实践

在模板模式中,我们通过将run方法进行重构,将run方法的实现写到了抽象类中,从而具体实现不需要再次进行实现,从而实现了模板模式。

在建造者模式中,新的需求要求各个模型的生产可以自由的调整各个方法的运行次序。为此我们重新进行建模
这里写图片描述

可以看到在CarModel中,我们添加了arraylist类型的sequence,然后根据sequence中,定义方法的次序,来依次执行方法。

public abstract class CarModel {        //这个参数是各个基本方法执行的顺序     private ArrayList<String> sequence = new ArrayList<String>();       //模型是启动开始跑了     protected abstract void start();        //能发动,还要能停下来,那才是真本事     protected abstract void stop();         //喇叭会出声音,是滴滴叫,还是哔哔叫     protected abstract void alarm();        //引擎会轰隆隆地响,不响那是假的     protected abstract void engineBoom();           //那模型应该会跑吧,别管是人推的,还是电力驱动,总之要会跑     final public void run() {                       //循环一边,谁在前,就先执行谁     for(int i=0;i<this.sequence.size();i++){                      String actionName = this.sequence.get(i);                                       if(actionName.equalsIgnoreCase("start")){                                this.start();  //启动汽车                      }else if(actionName.equalsIgnoreCase("alarm")){                               this.alarm(); //喇叭开始叫了                       }else if(actionName.equalsIgnoreCase("engine boom")){                                                            //如果是engine boom关键字                              this.engineBoom();  //引擎开始轰鸣                       }             }               }       //把传递过来的值传递到类内     final public void setSequence(ArrayList sequence){             this.sequence = sequence;     } }

CarModel的设计原理是这样的,setSequence方法是允许客户自己设置一个顺序,是要先启动响一下喇叭再跑起来,还是要先响一下喇叭再启动。对于一个具体的模型永远都固定 的,但是对N多个模型就是动态的了。在子类中实现父类的基本方法,run()方法读取 sequence,然后遍历sequence中的字符串,哪个字符串在先,就先执行哪个方法。

通过这样我们可以通过不同的sequence来设计不同的车模型,但是这样设计,我们只完成一个模型的设计,后面还有很多有什么好的解决办法呢?

对此我们再次对代码进行重构
这里写图片描述

增加了一个CarBuilder抽象类,由它来组装各个车模,要什么类型什么顺序的车辆模 型,都由相关的子类完成。

public abstract class CarBuilder {         //建造一个模型,你要给我一个顺序要求,就是组装顺序         public abstract void setSequence(ArrayList<String> sequence);         //设置完毕顺序后,就可以直接拿到这个车辆模型         public abstract CarModel getCarModel(); }
public class BenzBuilder extends CarBuilder {     private BenzModel benz = new BenzModel();     public CarModel getCarModel() {             return this.benz;     }     public void setSequence(ArrayList<String> sequence) {               this.benz.setSequence(sequence);     } }

至此,我们可以通过不同的Builder创造出不同的模型。但是在创造的过程中,仍然需要外部对顺序进行置顶。因此我们再次将Builder进行封装

这里写图片描述

在Direct中我们提供不同的方法,封装不同的执行顺序的模型,而客户端无须知道具体的实现,操作非常简单。

至此我们的建造者模式构建完成。

建造者模式的优点

  • 封装性——–客户端不需要知道产品的内部细节
  • 建造者独立———容易横向进行扩展,增加不同的Builder
  • 便于控制细节风险——–具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

建造者模式的使用场景

  • 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
  • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适

注意事项

建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方,虽然同为创建类模式,但是注重点不同。工厂类注重对象的创建,建造者模式注重对象创建的内部的顺序。

0 0