1、概念
指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。它将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。参考StringBuilder
优点:
- 封装性好,构建和表示分离。
- 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
- 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。
缺点: - 产品的组成部分必须相同,这限制了其使用范围。
- 如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。
2、实现
建造者(Builder)模式由产品、抽象建造者、具体建造者、指挥者等 4 个要素构成。
- 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
- 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
- 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
- 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
package com.mine.design.build;
public class Product {
private String partA;
private String partB;
private String partC;
public String getPartA() {
return partA;
}
public void setPartA(String partA) {
this.partA = partA;
}
public String getPartB() {
return partB;
}
public void setPartB(String partB) {
this.partB = partB;
}
public String getPartC() {
return partC;
}
public void setPartC(String partC) {
this.partC = partC;
}
@Override
public String toString() {
return "Product [partA=" + partA + ", partB=" + partB + ", partC=" + partC + "]";
}
}
package com.mine.design.build;
public abstract class Builder {
protected Product product = new Product();
public abstract void buildPartA(String partA);
public abstract void buildPartB(String partB);
public abstract void buildPartC(String partC);
public Product getResult() {
return product;
}
}
package com.mine.design.build;
public class ConcreteBuilder extends Builder {
@Override
public void buildPartA(String partA) {
this.product.setPartA(partA);
}
@Override
public void buildPartB(String partB) {
this.product.setPartB(partB);
}
@Override
public void buildPartC(String partC) {
this.product.setPartC(partC);
}
}
package com.mine.design.build;
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public Product create() {
this.builder.buildPartA("构建PartA");
this.builder.buildPartB("构建PartB");
this.builder.buildPartC("构建PartC");
return this.builder.getResult();
}
}
package com.mine.design.build;
public class Client {
public static void main(String[] args) {
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
Product product = director.create();
System.out.println(product);
}
}