概念
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
使用场景
主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
案例
下面写一个创建电脑的案例,电脑有 主板、显示屏、系统组成。但是我们想要创建一个Mac电脑。首先能确定苹果电脑的系统是OS。
computer
public abstract class Computer {
protected String os;
protected String broad;
protected String display;
public void setOs(String os) {
this.os = os;
}
public void setBroad(String broad) {
this.broad = broad;
}
public void setDisplay(String display) {
this.display = display;
}
@Override
public String toString() {
return "Computer{" +
"os='" + os + '\'' +
", broad='" + broad + '\'' +
", display='" + display + '\'' +
'}';
}
}
MacBook 以及内部类 Builder
public abstract class Builder {
public abstract Builder buildOs(String os);
public abstract Builder buildDisplay(String display);
public abstract Builder buildBroad(String broad);
public abstract Computer build();
}
public class MacBook extends Computer {
public MacBook(String os, String broad, String display) {
this.os = os;
this.broad = broad;
this.display = display;
}
public static class MacBookBuilder extends Builder{
private String os,broad,display;
@Override
public Builder buildOs(String os) {
this.os =os;
return this;
}
@Override
public Builder buildDisplay(String display) {
this.display = display;
return this;
}
@Override
public Builder buildBroad(String broad) {
this.broad= broad;
return this;
}
@Override
public Computer build() {
return new MacBook(os,broad,display);
}
}
}
执行代码
Computer macBookBuilder = new MacBook.MacBookBuilder()
.buildOs("huawei")
.buildDisplay("xxx")
.buildBroad("mac OS ")
.build();
Log.d(TAG, "testBuilder: " + macBookBuilder.toString());