定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
讲解:
一个对象(产品),可能有几部分组成。比如一辆汽车,主要由车身、发动机、轮胎、传动系统等组成。这些部件或系统就是对象的表示。而建造者模式将汽车这个复杂对象的构建过程与它的表示分离。也就是说客户只需要告诉建造者模式我想要什么样的汽车(小轿车或大卡车)就可以了。至于汽车是如何生产出来了,客户并不关心。同样的构建过程,构建出的汽车却不相同(小轿车或大卡车)。
类图:
角色:
产品类(Product):具体的产品,一般情况下是一个创建过程比较复杂的产品。
抽象建造者(Builder):抽象类,定义用来创建产品的抽象方法。
建造者(ConcreteBuilder):实现类,实现抽象建造者类,并实现其抽象方法。
导演类(Director):负责调用具体的建造者类,来完成产品的创建工作。
代码:
//产品类Product
class Car {
private String body;//车身
private String engine;//发动机
private String tire;//轮胎
private String driveSys;//传动系统
//省略get set方法
}
//抽象建造者Builder
abstract class Builder {
protected Car = new Car();
public abstract void buildBody(String body);//建造车身
public abstract void buildEngine(String engine);//建造发动机
public abstract void buildTire(String tire);//建造轮胎
public abstract void builcDriveSys(String driveSys);//建造传动系统
//获得汽车
public Car getCar(){
return car;
}
}
//小轿车建造者ConcreteBuilder
class CarBuilder extends Builder {
public void buildBody() {
car.setBody("小轿车车身");
}
public void buildEngine() {
car.setEngine("小轿车发动机");
}
public void buildTire() {
car.setTire("小轿车轮胎");
}
public void builcDriveSys() {
car.setDriveSys("小轿车传动系统");
}
}
//大卡车建造者ConcreteBuilder
class TruckBuilder extends Builder {
public void buildBody() {
car.setBody("大卡车车身");
}
public void buildEngine() {
car.setEngine("大卡车发动机");
}
public void buildTire() {
car.setTire("大卡车轮胎");
}
public void builcDriveSys() {
car.setDriveSys("大卡车传动系统");
}
}
//导演类
public class Director {
private Builder builder;
public void setBuilder(Builder builder) {
this.builder = builder;
}
public Car construct() {
builder.buildBody();
builder.buildEngine();
builder.buildTire();
builder.builcDriveSys();
return builder.getCar();
}
}
//客户端
public class Client {
public static void main(String[] args) {
Director director = new Director();//导演
Builder carBuilder = CarBuilder();
director.setBuilder(carBuilder);
Car car = director.construct();//小轿车
Builder truckBuilder = TruckBuilder();
director.setBuilder(truckBuilder);
Car truck = director.construct();//大卡车
}
}
好处:
- 符合依赖倒转原则,抽象不应该依赖细节,细节应该依赖于抽象。产品的创建依赖于抽象建造者类,而不依赖于具体的建造者类,产品的创建细节在建造者类中实现。
- 由于具体的建造者类之间相互独立,这样就可以定制化的实现不同的产品,而不影响其他已实现的功能。
- 易于扩展,如果现有的建造者无法满足需求,只需要增加一个新的建造者实现类即可,而不会影响其他已实现的功能。
使用场景:
- 稳定的创建过程,产品对象的创建过程稳定,也就是说抽象建造者类中的抽象方法稳定,不应该出现大的变动。
- 产品对象的创建过程极其复杂,如果产品对象的创建过于简单,则不适合使用建造者模式。