建造者模式
说明
建造者模式(Builder Pattern)属于创建型模式,是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
在某些业务场景中,一个复杂对象的构建可能需要很多的步骤,而这些步骤存在普遍性,如果每次创建该对象都需要操作这些步骤,难免会出现某个步骤遗漏等情况,使用建造者模式可以将这些普遍的步骤抽象出来,让具体的建造者按照规定好的步骤构建对象,使整个构建过程更加规范化。
比如电脑是由主板、CPU、内存、显卡、硬盘等等组成,组装电脑的顺序基本是不变的。
结构
建造者模式的主要角色如下:
产品角色(Product):一个复杂的对象,由多个部件组成,构建该对象时需要多个步骤才能完成,由具体的建造者完成构建。
抽象建造者(Builder):定义了创建复杂产品各个部件的抽象方法,并且还有一个返回最终构建好的复杂对象的方法。
具体的建造者(Concrete Builder):实现抽象建造者的抽象方法,根据具体的需求完成对复杂对象的具体构建。
指挥者(Director):指挥具体的建造者按照规定好的步骤构建对象,并返回该对象。
代码案例
/**
* @program: builder
* @description: 汽车类
* @author: wxw
* @create: 2024-03-06 18:14
**/
@Data
public class Car {
// 汽车类型
private String type;
// 汽车级别
private String level;
// 发动机
private String engine;
// 电池
private String battery;
// 展示信息
public void showInfo(){
System.out.println(String.format("汽车类型:%s 汽车级别:%s 发动机:%s 电池:%s",
this.type,this.level,this.engine,this.battery));
}
}
/**
* @program: builder
* @description: 抽象的汽车建造者
* @author: wxw
* @create: 2024-03-06 18:20
**/
public abstract class CarBuilder {
// 包含具体的产品实例
protected Car car = new Car();
// 构建汽车类型
public abstract void buildType();
// 构建汽车级别
public abstract void buildLevel();
// 构建发动机
public abstract void buildEngine();
// 构建电池
public abstract void buildBattery();
/**
* 返回产品实例
* @return
*/
public Car getCar(){
return this.car;
}
}
/**
* @program: builder
* @description: 电动车建造者
* @author: wxw
* @create: 2024-03-06 18:22
**/
public class ElectrocarBuilder extends CarBuilder {
@Override
public void buildType() {
car.setType("SUV");
}
@Override
public void buildLevel() {
car.setLevel("中大型车");
}
@Override
public void buildEngine() {
car.setEngine("电动车,无需安装发动机");
}
@Override
public void buildBattery() {
car.setBattery("磷酸铁锂电池");
}
}
/**
* @program: builder
* @description: 燃油车建造者
* @author: wxw
* @create: 2024-03-06 18:22
**/
public class FuelVehicleBuilder extends CarBuilder {
@Override
public void buildType() {
car.setType("轿车");
}
@Override
public void buildLevel() {
car.setLevel("中型车");
}
@Override
public void buildEngine() {
car.setEngine("2.0T发动机");
}
@Override
public void buildBattery() {
car.setBattery("燃油车,无需安装电池");
}
}
/**
* @program: builder
* @description: 指挥者
* @author: wxw
* @create: 2024-03-06 18:31
**/
public class Director {
private CarBuilder carBuilder;
public Director(CarBuilder carBuilder) {
this.carBuilder = carBuilder;
}
// 按照规定的步骤组装汽车
public Car construct(){
carBuilder.buildType();
carBuilder.buildLevel();
carBuilder.buildEngine();
carBuilder.buildBattery();
return carBuilder.getCar();
}
}
/**
* @program: builder
* @description: 客户端类
* @author: wxw
* @create: 2024-03-06 18:33
**/
public class Client {
public static void main(String[] args) {
// 燃油车建造者
CarBuilder fuelVehicleBuilder = new FuelVehicleBuilder();
Director director = new Director(fuelVehicleBuilder);
Car car = director.construct();
car.showInfo();
// 电动车
CarBuilder electrocarBuilder = new ElectrocarBuilder();
director = new Director(electrocarBuilder);
car = director.construct();
car.showInfo();
}
}
输出:
汽车类型:轿车 汽车级别:中型车 发动机:2.0T发动机 电池:燃油车,无需安装电池
汽车类型:SUV 汽车级别:中大型车 发动机:电动车,无需安装发动机 电池:磷酸铁锂电池