1.定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式是一步一步创建一个复杂对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
2.模式结构
3.建造者模式包含如下角色:
(1)Builder(抽象建造者)
抽象建造者为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类是builderPartX(),它们用于创建复杂对象的各个部件,另一类方法是getResult(),它们用于返回复杂对象。它既可以是抽象类,也可以是接口。
(2)ConcreteBuilder(具体建造者)
具体建造者实现了Builder接口,实现了各个部件的构造和配置方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
(3)Product(产品角色)
产品角色是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。
(4)Director(指挥者)
智慧指挥者又称导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其consturct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的构建
建造者模式中引入了指挥者Director,该类的主要作用有两个:一方面它隔离了客户和生产过程,另一方面它负责控制产品的生成过程。指挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,即可通过指挥者类调用建造者的相关方法,返回一个完整的产品对象。
4.建造者模式实例
(1)产品类
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;
}
}
(2)抽象建造者类
public abstract class Builder {
Product product=new Product();
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
public Product getResult(){
return product;
}
}
在抽象类Builder中声明了抽象的builderPartX()方法,具体建造过程在子类中实现,此外还提供了工厂方法getResult(),用于返回一个建造好的完整产品类。
(3)具体建造者类
public class ConcreteBuilder extends Builder{
public void buildPartA() {
product.setPartA("partA");
}
public void buildPartB() {
product.setPartB("partB");
}
public void buildPartC() {
product.setPartC("partC");
}
(4)指挥者类
public class Director {
private Builder builder;
public Director(Builder Builder){
this.builder=Builder;
}
public Product construct(){
builder.buildPartB();
builder.buildPartA();
builder.buildPartC();
return builder.getResult();
}
}
一个在指挥者类中传入一个建造者Builder类型的对象,其核心在于提供一个建造方法construct(),在该方法中调用builder对象的构造部件的方法,最后返回一个产品对象。在constuct方法中还指定了builderPartX()的执行次序。
(5)测试类
public class Test {
public static void main(String[] args) {
//确定具体的创建者
Builder builder=new ConcreteBuilder();
//确定指挥者
Director dirctor=new Director(builder);
//指挥者指挥创建产品
Product product=dirctor.constuct();
System.out.println("创建结果:");
System.out.println(product.getPartA());
System.out.println(product.getPartB());
System.out.println(product.getPartC());
}
}
对于具体的建造者ConcreteBuilder,也可以通过配置文件的形式来存储具体的建造者类的类名,使得更换新的建造者无需修改源码,系统扩展更加方便。在客户端代码中,无需关心产品对象的具体组装过程,只需确定具体建造者即可,建造者模式将复杂类型的对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的过程。