建造者模式
建造者模式

使命
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
主要解决在软件系统中,有时候面临着”一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
优点
- 拓展性好
- 细节把控方便
缺点
- 建造产品必须要有共同点,范围有限制
- 内部复杂,类衍生迅速
老生常谈,继续聊回我们的造车故事,最近造车厂提供了些定制化服务,让客户可以自定义选配各种配件,我们来看看,这是怎么实现的

汽车部件
public interface Item {
String name();
float price();
}
引擎部件
public interface Engine extends Item {
}
V6引擎
public class V6Engine implements Engine {
@Override
public String name() {
return "V6引擎";
}
@Override
public float price() {
return 3_5000.99f;
}
}
V12引擎
public class V12Engine implements Engine {
@Override
public String name() {
return "V12引擎";
}
@Override
public float price() {
return 12_0000f;
}
}
配色部件
public interface Color extends Item {
}
蓝色
public class ColorBlue implements Color {
@Override
public String name() {
return "蓝色配色";
}
@Override
public float price() {
return 3000f;
}
}
红色
public class ColorRed implements Color {
@Override
public String name() {
return "红色配色";
}
@Override
public float price() {
return 2000f;
}
}
汽车
public class Car {
private String name;
private List<Item> items = new LinkedList<>();
public void setName(String name) {
this.name = name;
}
/**
* 添加汽车配件
*
* @param item
*/
public void addItem(Item item) {
items.add(item);
}
public String getInfo() {
String allItem = "";
float price = 0.0f;
for (Item item : items) {
allItem += item.name() + " ";
price += item.price();
}
return name + " 的所有部件为:" + allItem + " 价格为: " + price;
}
}
汽车建造者
public class CarBuilder {
public Car getV6RedCar() {
Car v6 = new Car();
v6.setName("红魔");
Item engine = new V6Engine();
Item red = new ColorRed();
v6.addItem(engine);
v6.addItem(red);
return v6;
}
public Car getV12BlueCar() {
Car v12 = new Car();
v12.setName("蓝军");
Item engine = new V12Engine();
Item red = new ColorBlue();
v12.addItem(engine);
v12.addItem(red);
return v12;
}
}
客户开始选择定制化车辆
public static void main(String[] args) {
CarBuilder builder = new CarBuilder();
Car v6 = builder.getV6RedCar();
Car v12 = builder.getV12BlueCar();
System.out.println(v6.getInfo());
System.out.println(v12.getInfo());
}
和工厂模式对比,工厂模式更注重整体的生产,而建造者模式更注重细节把控,后者会更灵活,但是也会是整体架构复杂化,这两者是针对不同的场景,切勿混淆使用。