建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
对一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
其实建造者模式在项目中经常能够看到,比如在Android中我们使用AlertDialog的时候。如下:

类似的还有很多的库都使用了这种建造者模式,可以见的学习这种模式的必要性了。建造模式的类UML类图如下:

构建模式涉及到的角色如下:
抽象构建角色(Builder):给出一个抽象接口,规范产品对象的各个组成成分的构建。在Java中使用接口或者抽象类进行担任,如果抽象构建角色中包含一些其他的业务代码,则推荐使用抽象类。
具体构建角色(ConcreteBuilder):抽象构建角色的具体实现,该角色实现了抽象构建角色声明的接口方法且提供产品的实例。
产品角色(Product):产品是构造中的复杂对象(因为需要构建角色创建多个方法才能进行创建),一般来说,一个系统中会多于一个的产品类。
导演者角色(Director):该角色使用具体建造角色创建产品对象。主要目的是将产品的创建过程进行封装,一个产品创建的过程可能非常复杂,如果不进行封装,则在每次创建不同的产品时,均要重复编写创建产品过程的复杂代码。
实例:我们以创建一辆车为例,车由车牌、颜色和车标组成,下面通过构建模式来创建车辆,可以创建不同种类的车,如:宝马、奔驰、兰博基尼等等。涉及的类如下:
Car:车辆产品
Builder:抽象构建器
CarBuilder:车辆的具体构建器
Director:导演角色,将Builder传递到该类,然后构建车辆的生成过程,客户端使用该类来生产车辆产品。
Java代码如下:
public class SimpleBuilder {
public static void main(String[] args) {
Builder builder = new CarBuilder();
Director director = new Director(builder);
director.construct("red", "A88888", "Ferrari");
System.out.println(builder.build().toString());
}
}
/**
* 产品(车子)
*/
class Car {
private String color;
private String licensePlate;
private String brand;
public void setColor(String color) {
this.color = color;
}
public void setLicensePlate(String licensePlate) {
this.licensePlate = licensePlate;
}
public void setBrand(String brand) {
this.brand = brand;
}
@Override
public String toString() {
return "Car{" + "color='" + color + '\'' + ", licensePlate='"
+ licensePlate + '\'' + ", brand='" + brand + '\'' + '}';
}
}
/**
* 抽象构建角色(汽车厂规范)
*/
interface Builder {
// 构建车的颜色
void buildColor(String color);
// 构建车的车牌
void buildLicensePlate(String licensePlate);
// 构建车的商标
void buildBrand(String brand);
// 构建完成最终的汽车
Car build();
}
/**
* 具体汽车厂
*/
class CarBuilder implements Builder {
private Car car;
public CarBuilder() {
this.car = new Car();
}
@Override
public void buildColor(String color) {
car.setColor(color);
}
@Override
public void buildLicensePlate(String licensePlate) {
car.setLicensePlate(licensePlate);
}
@Override
public void buildBrand(String brand) {
car.setBrand(brand);
}
@Override
public Car build() {
return car;
}
}
/**
* 导演角色,利用实际汽车厂生产汽车
*/
class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void construct(String color, String licensePlate, String brand) {
// 车辆生产过程(可能非常复杂)
builder.buildColor(color);
builder.buildLicensePlate(licensePlate);
builder.buildBrand(brand);
}
}