建造者模式
将复杂对象的构建进行分离,使得同样的构造过程可以创建不同的表示
建造者(Builder
)模式包含如下角色:
-
抽象建造者类(
Builder
):这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的部件对象的创建。 -
具体建造者类(
ConcreteBuilder
):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例。 -
产品类(
Product
):要创建的复杂对象。 -
指挥者类(
Director
):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
产品类:
public class Bike {
private String frame;
private String seat;
}
抽象建造者类
public abstract class Builder {
protected Bike myBike = new Bike();
public abstract void buildFrame();
public abstract void buildSeat();
public abstract Bike createBike();
}
具体建造者类(可以根据Builder
创建不同的具体创建者类)
public class MobikeBuilder extends Builder{
@Override
public void buildFrame() {
myBike.setFrame("铝合金车架");
}
@Override
public void buildSea() {
myBike.setSeat("真皮座椅");
}
@Override
public Bike createBike() {
return myBike;
}
}
指挥者类:相当于封装调用具体建造类的方式,如何去建造
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public Bike construct() {
builder.buildFrame();
builder.buildSeat();
return builder.createBike();
}
}
拓展:这样写真不错
public class Phone {
private String cpu;
private String screen;
private String memory;
private String mainboard;
private Phone(Builder builder) {
cpu = builder.cpu;
screen = builder.screen;
memory = builder.memory;
mainboard = builder.mainboard;
}
public static final class Builder {
private String cpu;
private String screen;
private String memory;
private String mainboard;
public Builder() {}
public Builder cpu(String val) {
cpu = val;
return this;
}
public Builder screen(String val) {
screen = val;
return this;
}
public Builder memory(String val) {
memory = val;
return this;
}
public Builder mainboard(String val) {
mainboard = val;
return this;
}
public Phone build() {
return new Phone(this);}
}
@Override
public String toString() {
return "Phone{" +
"cpu='" + cpu + '\'' +
", screen='" + screen + '\'' +
", memory='" + memory + '\'' +
", mainboard='" + mainboard + '\'' +
'}';
}
}
可以这样调用:
Phone phone = new Phone.Builder()
.cpu("intel")
.mainboard("华硕")
.memory("金士顿")
.screen("三星")
.build();
System.out.println(phone);