概述
建造者(Builder)模式,又称为生成器模式。它是将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。当采用了建造者模式,用户就只需要指定需要建造的类型就可以得到想要的最终结果,至于具体的构建过程和构建细节不需要过多知晓。
UML
Director:指挥者,主要负责调度Builder接口对象,构建成型的产品。
Builder:抽象接口,封装了Product各个部件的生产方法和工序。
ConcreteBuilder:具体的构建者,它实现了Builder接口,执行具体的构建过程。
Product:具体的产品类。
代码举例
/**
* 角色:Product
* 产品类
*/
public class Product {
ArrayList<String> parts = new ArrayList<>();
public void add(String part) {
parts.add(part);
}
public void show() {
for (String part : parts) {
System.out.println(part);
}
}
}
/**
* 角色:Builder
* 建造者基类
*/
public interface Builder {
void buildPartA();
void buildPartB();
void buildPartC();
Product getFinalProduct();
}
/**
* 角色:ConcreteBuilder
* 具体的建造者
*/
public class ConcreteBuilderA implements Builder {
private Product product;
public ConcreteBuilderA() {
product = new Product();
}
@Override
public void buildPartA() {
product.add("part a");
}
@Override
public void buildPartB() {
product.add("part b");
}
@Override
public void buildPartC() {
product.add("part c");
}
@Override
public Product getFinalProduct() {
return product;
}
}
/**
* 角色:ConcreteBuilder
* 具体的建造者
*/
public class ConcreteBuilderB implements Builder {
private Product product;
public ConcreteBuilderB() {
product = new Product();
}
@Override
public void buildPartA() {
product.add("part x");
}
@Override
public void buildPartB() {
product.add("part y");
}
@Override
public void buildPartC() {
product.add("part z");
}
@Override
public Product getFinalProduct() {
return product;
}
}
/**
* 角色:ConcreteBuilder
* 具体的建造者
*/
public class ConcreteBuilderC implements Builder {
private Product product;
public ConcreteBuilderC() {
product = new Product();
}
@Override
public void buildPartA() {
product.add("part one");
}
@Override
public void buildPartB() {
product.add("part two");
}
@Override
public void buildPartC() {
product.add("part three");
}
@Override
public Product getFinalProduct() {
return product;
}
}
/**
* 角色:Director
* 指挥者
*/
public class Director {
public void Construct(Builder builder) {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
}
public class Main {
public static void main(String[] args) {
Director director = new Director();
Builder builderA = new ConcreteBuilderA();
Builder builderB = new ConcreteBuilderB();
Builder builderC = new ConcreteBuilderC();
director.Construct(builderA);
director.Construct(builderB);
director.Construct(builderC);
Product productA = builderA.getFinalProduct();
Product productB = builderB.getFinalProduct();
Product productC = builderC.getFinalProduct();
productA.show();
productB.show();
productC.show();
}
}
总结
建造者的思维模式是将构建的方法和具体的构建操作分离,Builder类提供具体的构建方法,Director类来负责调度和下达构建指令。这样的话,可以将产品的结构和产品的零件的建造过程对客户端隐藏起来,把对建造过程进行指挥的责任和具体建造者零件的责任分割开来,达到责任划分和封装的目的。