2017年的时候了解了建造者模式老的文章,现在看来还是不够优雅,最近看源码又温习各种设计模式,所以重新总结一下,也给以后的自己留个记录,对比自己的成长。
建造者模式,目的就是把复杂对象的内部组装流程和组建的具体表示给解耦。就如同中国宝马汽车制造流水线,流程都一样,只是每一个流程使用的具体品牌或则规格不太一样,现在就可以制造出来3系,5系等等不同的车,哪天工厂升级了,来个7系的生产,流程差不多,主要就是升级了更好的配件。其实没必要严格的按照网上所谓的标准的类图去设计,例如我认为其中导演类我就认为没必要,可以封装在要创建的对象内部。还是以我说制造汽车的例子,过了3年我再来重写,我会这样:
class BMWCar {
/**
* 系列
*/
private String series;
/**
* 颜色
*/
private String color;
/**
* 价格
*/
private String price;
// setter getter
public static BMWCar build(CarBuilder carBuilder) {
BMWCar BMWCar = new BMWCar();
// 这里定义组建对象的流程,至于如何创建和创建的什么东西,CarBuilder作为接口,并不关心,这里也体现了依赖抽象的思想
// 先定义品牌,再定义颜色, 再定义成本价格
carBuilder.buildPrice(BMWCar).buildColor(BMWCar).buildBrand(BMWCar);
return BMWCar;
}
}
// 定义每个汽车配件的组装
interface CarBuilder {
CarBuilder buildBrand(BMWCar BMWCar);
CarBuilder buildColor(BMWCar BMWCar);
CarBuilder buildPrice(BMWCar BMWCar);
}
// 3系的builder实现
class BMW3Builder implements CarBuilder {
@Override
public CarBuilder buildBrand(BMWCar BMWCar) {
BMWCar.setSeries("3系");
return this;
}
@Override
public CarBuilder buildColor(BMWCar BMWCar) {
BMWCar.setColor("白色");
return this;
}
@Override
public CarBuilder buildPrice(BMWCar BMWCar) {
BMWCar.setPrice("30w");
return this;
}
}
// 5系的builder实现
class BMW5Builder implements CarBuilder {
@Override
public CarBuilder buildBrand(BMWCar BMWCar) {
BMWCar.setSeries("5系列");
return this;
}
@Override
public CarBuilder buildColor(BMWCar BMWCar) {
BMWCar.setColor("黑色");
return this;
}
@Override
public CarBuilder buildPrice(BMWCar BMWCar) {
BMWCar.setPrice("50w");
return this;
}
}
我们在使用的时候:
System.out.println(BMWCar.build(new BMW3Builder()));
System.out.println(BMWCar.build(new BMW5Builder()));
打印:
BMWCar{series=‘3系’, color=‘白色’, price=30w}
BMWCar{series=‘5系列’, color=‘黑色’, price=50w}
制造其他系的车,只要去实现新的Builder即可不用改原先的任何代码,这就是建造者模式的核心理念。