建造者模式
定义: 将一个复杂对象的构建与表示分离, 使得同样的构建过程可以创建不同的表示
- 分离了部件的构造和装配, 从而可以构造出复杂对象, 适用于某个对象构造复杂的情况
- 由于构造和装配解耦, 不同构造器相同装配顺序也可以构造出不同的对象, 相同的构造器不同的装配顺序也可以做出不同的对象
- 建造者模式将部件和构造分开, 一步一步创建一个复杂对象, 用户只需要指定复杂对象的类型就可以得到该对象, 无需知道细节
结构:
- 抽象建造者类: 这个接口规定实现复杂对象的哪些部分的创建, 并不设计具体对象部件的创建
- 具体建造者类: 实现抽象建造者类接口, 完成复杂产品各个部件的具体创建方法, 构造过程完成后, 提供产品实例
- 产品类: 要创建的复杂对象
- 指挥者类: 调用具体创建者来创建复杂对象的各个部分, 在指挥者类中不设计具体产品的信息, 只保证对象各部分完整创建或按某种顺序创建
实现:
例: 生产自行车, 包含了车架, 车座等组件的生产, 车架又有碳纤维, 铝合金等材质, 车座有橡胶真皮等材质
抽象建造者类
public abstract class Builder {
protected Bike bike = new Bike();
public abstract void buildFrame();
public abstract void buildSeat();
public abstract Bike createBike();
}
具体建造者类
public class MobileBikeBuilder extends Builder{
public void buildFrame() {
bike.setFrame("碳纤维车架");
}
public void buildSeat() {
bike.setSeat("真皮座椅");
}
public Bike createBike() {
return bike;
}
}
public class OfoBikeBuilder extends Builder{
public void buildFrame() {
bike.setFrame("铝合金车架");
}
public void buildSeat() {
bike.setSeat("橡胶座椅");
}
public Bike createBike() {
return bike;
}
}
产品类
@Data
public class Bike {
private String seat;
private String frame;
}
指挥者类
@AllArgsConstructor
public class Director {
private Builder builder;
public Bike construct() {
builder.buildFrame();
builder.buildSeat();
return builder.createBike();
}
}
Main
public class Main {
public static void main(String[] args) {
Builder builder1 = new MobileBikeBuilder();
Builder builder2 = new OfoBikeBuilder();
Director director1 = new Director(builder1);
System.out.println(director1.construct());
Director director2 = new Director(builder2);
System.out.println(director2.construct());
}
}
注意: 如果需要简化系统结构, 可以将指挥者类与抽象建造者类进行结合, 但是这样会加重Builder的职责, 如果construct()过于复杂, 还是放到指挥者类中更好