文章目录
建造者模式(创建型)
建造者模式包含如下角色:抽象建造者类、具体建造者类、产品类、指挥者类。
概述
工厂造零件,建造者造更大的
代码实现
public abstract class Builder{
//一些抽象方法
public abstract void buildA();
public abstract void buildB();
public abstract A createA()
}
//具体建造者 XXXBuilder YYYBuilder
public class XXXBuilder extends Builder {
//建造的对象
A a = new A();
//建造A的步骤buildA buildB
@Override
public void buildA() {
a.setA("A步骤的完成结果,比如地基");
}
public void buildB() {
a.setB("B步骤的完成结果,比如钢筋水泥");
}
...
}
//指挥者
public class Director {
//抽象的建造者
private Builder builder;
//指挥具体的建造者
public Director(Builder builder){
this.builder = builder;
}
//指挥建造过程并返回最后总结果
public A construct(){
builder.buildA();
builder.buildB();
return builder.createA();
}
}
//测试
public class Client {
public static void main(String[] args) {
//指挥者指挥XXXBuilder建造者来建造A
Director director = new Director(new XXXBuilder());
A a = director.construct();
}
}
内部类和链式编程
public class Phone {
private String cpu;
private String screen;
private String memory;
private String mainboard;
private Phone(Builder builder) {
this.cpu = builder.cpu;
this.screen = builder.screen;
this.memory = builder.memory;
this.mainboard = builder.mainboard;
}
@Override
public String toString() {
return "Phone{" +
"cpu='" + cpu + '\'' +
", screen='" + screen + '\'' +
", memory='" + memory + '\'' +
", mainboard='" + mainboard + '\'' +
'}';
}
//**********留意这里 发现没有指挥者了,Builder就充当了指挥者
public static final class Builder {
private String cpu;//可以带默认值
private String screen;
private String memory;
private String mainboard;
public Builder cpu(String cpu) {
this.cpu = cpu;
return this;//**********留意这里
}
public Builder screen(String screen) {
this.screen = screen;
return this;
}
public Builder memory(String memory) {
this.memory = memory;
return this;
}
public Builder mainboard(String mainboard) {
this.mainboard = mainboard;
return this;
}
public Phone build() {
return new Phone(this);
}
}
}
//测试
public class Client {
public static void main(String[] args) {
Phone phone = new Phone.Builder()
.cpu("intel")
.screen("三星屏幕")
.memory("金士顿内存条")
.mainboard("华硕主板")
.build();
System.out.println(phone);
}
}