建造者模式
建造者模式属于创建者模式,提供了一个创建对象的方式,用户只需给出制定复杂对象的类型,建造者负责按顺序创建复杂对象(隐藏构造细节)
场景:包工头指挥工人建造房子,按照(1)地基(2)钢筋工程(3)铺电线(4)粉刷,其中有三个角色:包工头(指挥者)工人(具体的建造者)房子(产品)
//抽象建造者
public abstract class Builder {
public abstract void buildA();
public abstract void buildB();
public abstract void buildC();
public abstract void buildD();
public abstract Product getProduct();
}
//产品:房子
public class Product {
private String buildA;
private String buildB;
private String buildC;
private String buildD;
public void setBuildA(String buildA) {
this.buildA = buildA;
System.out.println("地基");
}
public void setBuildB(String buildB) {
this.buildB = buildB;
System.out.println("钢筋工程");
}
public void setBuildC(String buildC) {
this.buildC = buildC;
System.out.println("铺电线");
}
public void setBuildD(String buildD) {
this.buildD = buildD;
System.out.println("粉刷");
}
@Override
public String toString() {
return "Product{" +
"buildA='" + buildA + '\'' +
", buildB='" + buildB + '\'' +
", buildC='" + buildC + '\'' +
", buildD='" + buildD + '\'' +
'}';
}
}
//工人
public class Worker extends Builder {
private Product product;
public Worker() {
this.product = new Product();
}
@Override
public void buildA() {
product.setBuildA("地基");
}
@Override
public void buildB() {
product.setBuildB("钢筋工程");
}
@Override
public void buildC() {
product.setBuildC("铺电线");
}
@Override
public void buildD() {
product.setBuildD("粉刷");
}
@Override
public Product getProduct() {
return product;
}
}
//指挥者
public class Director {
public Product builder(Builder builder) {
builder.buildA();
builder.buildB();
builder.buildC();
builder.buildD();
return builder.getProduct();
}
public static void main(String[] args) {
Director director = new Director();
Product builder = director.builder(new Worker());
System.out.println(builder.toString());
}
}
上面这种方式是建造者模式常规的用法,Director起着重要作用,用于指导具体构建者如何构建产品,规定了构建顺序,但是有些情况相爱需要简化系统结构,可以把Director省略,通过一种链式构造对象,这种方式可以实现自定义构建顺序,把指挥这一角色交给用户
场景:麦当劳套餐,服务员(具体建造者)可以随意搭配任意几种产品组成一款套餐(产品),然后出售给用户
public abstract class Builder {
public abstract Builder buildA(String str);
public abstract Builder buildB(String str);
public abstract Builder buildC(String str);
public abstract Builder buildD(String str);
public abstract Product getProduct();
}
public class Product {
//默认套餐
private String buildA = "汉堡";
private String buildB = "薯条";
private String buildC = "可乐";
private String buildD = "鸡翅";
public void setBuildA(String buildA) {
this.buildA = buildA;
}
public void setBuildB(String buildB) {
this.buildB = buildB;
}
public void setBuildC(String buildC) {
this.buildC = buildC;
}
public void setBuildD(String buildD) {
this.buildD = buildD;
}
@Override
public String toString() {
return "Product{" +
"buildA='" + buildA + '\'' +
", buildB='" + buildB + '\'' +
", buildC='" + buildC + '\'' +
", buildD='" + buildD + '\'' +
'}';
}
}
public class Worker extends Builder {
private Product product;
public Worker() {
this.product = new Product();
}
@Override
public Builder buildA(String str) {
product.setBuildA(str);
return this;
}
@Override
public Builder buildB(String str) {
product.setBuildB(str);
return this;
}
@Override
public Builder buildC(String str) {
product.setBuildC(str);
return this;
}
@Override
public Builder buildD(String str) {
product.setBuildD(str);
return this;
}
@Override
public Product getProduct() {
return product;
}
}
public class Test{
public static void main(String[] args) {
//默认套餐
Worker worker1 = new Worker();
Product product = worker1.getProduct();
System.out.println(product.toString());
//自定义套餐
Worker worker2 = new Worker();
worker2.buildA("全家桶").buildB("甜点");
System.out.println(worker2.getProduct());
}
}