简介
建造者模式是一种创建型设计模式,它把对象的创建步骤抽象成生成器,并且可以通过指导类(director)对所有生成步骤的先后顺序进行控制。客户端使用指导类并传入相应的生成器,通过指导类的接口便可以得到相应的对象。
主要四大角色:
Product:表示被构造的复杂对象,其中包含需要构建的部件属性。
Builder:创建一个产品对象的各个部件指定抽象接口。
ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示。
Director:调用具体建造者角色以创建产品对象。
生成器模式与抽象工厂模式的区别
生成器模式:
构建复杂对象
以多个步骤构建对象
以多种方式构建对象
在构建过程的最后一步返回产品
专注一个特定产品工厂模式:
构建简单或复杂对象
以单一步骤构建对象 以单一方式构建对象
立刻返回产品
强调一套产品
示例
以生产汽车为例,骑车包含发动机、轮胎、座椅等等部件。
角色1Product
Car.java
public class Car {
private String wheel;
private String engine;
private String seats;
public String getWheel() {
return wheel;
}
public void setWheel(String wheel) {
this.wheel = wheel;
}
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
public String getSeats() {
return seats;
}
public void setSeats(String seats) {
this.seats = seats;
}
}
角色2Builder
CarBuilder.java
public interface CarBuilder {
String buildWheel();
String buildEngine();
String buildSeats();
}
角色3ConcreteBuilder
CarConcreteBuilder.java
public class CarConcreteBuilder implements CarBuilder {
@Override
public String buildWheel() {
return "wheel";
}
@Override
public String buildEngine() {
return "engine";
}
@Override
public String buildSeats() {
return "seats";
}
}
角色4Director
CarDirector.java
public class CarDirector {
CarBuilder carBuilder;
public CarDirector(CarBuilder carBuilder) {
this.carBuilder = carBuilder;
}
public Car createCar(){
Car car = new Car();
car.setEngine(carBuilder.buildEngine());
car.setSeats(carBuilder.buildSeats());
car.setWheel(carBuilder.buildWheel());
return car;
}
}
验证:
public class Main {
public static void main(String[] args) {
CarDirector carDirector = new CarDirector(new CarConcreteBuilder());
Car car = carDirector.createCar();
System.out.println(car.getEngine());
System.out.println(car.getSeats());
System.out.println(car.getWheel());
}
}
engine
seats
wheel
建造者模式的优点
首先,建造者模式的封装性很好。
使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。
其次,建造者模式很容易进行扩展。
如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。