建造者模式定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式结构图
建造者模式角色介绍
Builder:抽象建造者角色,负责定义创建Product产品对象的各个部件接口,同时定义获取完成Product产品对象的接口。
ConcreteBuilder:具体建造者角色,它实现了Builder接口,实现各个部件的具体构造和装配方法,实现了获取最终复杂产品对象结果的方法。
Product:产品角色,它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的各个组成部分。
Director:指挥者角色,它负责安排复杂对象的建造次序,指挥者面向抽象建造者编程。指挥者在construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造,并通过建造者获取建造的完整复杂产品对象。
建造者模式结构代码
抽象建造者:
public abstract class Builder {
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
public abstract Product getResult();
}
具体建造者:
public class ConcreteBuilder extends Builder {
Product product = new Product();
public void buildPartA() {
product.setPartA("PartA");
}
public void buildPartB() {
product.setPartA("PartB");
}
public void buildPartC() {
product.setPartA("PartC");
}
public Product getResult() {
return product;
}
}
产品:
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;
}
}
指挥者:
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public Product construct(){
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getResult();
}
}
客户端:
public class Client {
public static void main(String[] args) {
Director director = new Director(new ConcreteBuilder());
Product product = director.construct();
System.out.println("PartA:"+product.getPartA()+",PartB:"+product.getPartB()+",PartC:"+product.getPartC());
}
}
建造者模式运行机制
客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。最后客户端只需要与指挥者进行交互,就可以完成复杂产品对象的创建和获取。
建造者模式解决的核心问题
建造者模式解决的是复杂对象创建和组装过程。复杂对象的组成部分和创建过程是固定的,所以将固定的组成部分交由抽象建造者的抽象方法定义,将固定的创建过程交由指挥者管理。但这个复杂对象具有不同的表现形式,则通过不同的具体建造者来实现,表现形式不同,建造者就不同。