建造者模式
建造者模式的定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
- 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
- 便于控制细节风险——–具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
建造者模式的使用场景
- 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
- 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适
注意事项
建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方,虽然同为创建类模式,但是注重点不同。工厂类注重对象的创建,建造者模式注重对象创建的内部的顺序。