建造者模式适用场景
1、在接口中,所有的抽象的行为(方法),不需要全部实现
例如:电动车和汽油车。电动车的行为是充电。而汽油车的行为是加油
2、符合设计模式的单一职责和开闭原则
例如:新增卡车的时候,还需要修改原来的代码
3、不想创建很多的构造方法
例如:创造电动车和汽油车。会建2个构造方法,以后扩展的话,还会建很多的构造方法
建造者模式成员
1、Product (产品类):需要为其构建对象的类,是具有不同表现形式的复杂或者复合类。
2、Buider(构建者基类):抽象了所有车的行为(接口类)。
3、ConcreteBuilder(具体构建者类):实现了构建者基类的方法。(依赖产品类)
但是按着不同的场景去实现。
例如:电动车就不需要加油的方法,所以实现的时候直接返回
汽油车不需要充电的方法,所以实现的时候直接返回
4、Director(导演类):
实际的service层,入参为Buider(构建者基类),实际实现的时候,传的入参由场景而定。
案例
Q:电动车和汽油车的启动。
1、电动车:充电,启动
2、汽油车:加油,启动
/**
* 汽车行为基类(建造者模式基类)
*
*
* */
public interface CarBuilder {
/**
* 生产
*
* */
public CarProduct production();
/**
* 启动
*
* */
public void startUp();
/**
* 加油
*
* */
public void addGasoline();
/**
* 充电
*
* */
public void charge();
}
/**
* 具体实现类,依赖产品类
* 建造者模式基类的实现类,实现电动车。
* 所有加汽油的行为,直接返回
* 例如: addGasoline
*
* */
public class ElectricBuilder implements CarBuilder{
@Autowired
CarProduct carProduct;
@Override
public CarProduct production() {
System.out.println("生产电动汽车");
charge();
startUp();
carProduct.setPrice(100.00);
return null;
}
@Override
public void startUp() {
System.out.println("用电启动");
}
/**
* 该类是生产电动汽车的,加汽油的行为不能有,直接返回即可
*
* */
@Override
public void addGasoline() {
return;
}
@Override
public void charge() {
System.out.println("充电中");
}
}
/**
* 具体实现类,依赖产品类
* 建造者模式,加汽油构建。
* 所有电动车的行为,直接返回。
* 例如:charge
*
* */
public class GasolineBuilder implements CarBuilder{
@Autowired
CarProduct carProduct;
@Override
public CarProduct production() {
System.out.println("生产汽油车");
addGasoline();
startUp();
carProduct.setPrice(100.00);
return null;
}
@Override
public void startUp() {
System.out.println("加油启动");
}
@Override
public void addGasoline() {
System.out.println("加汽油中");
}
/**
* 由于是加汽油的,不能充电。所以直接返回
*
*
* */
@Override
public void charge() {
return;
}
}
/**
* 建造者模式中的产品类(Moudle类)
* 汽车的综合属性
*
*
* */
public class CarProduct {
/**
* 价格
*
* */
private Double price;
/**
* 重量
*
* */
private Double weight;
/**
* 轮胎
*
* */
private List<Object> list;
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Double getWeight() {
return weight;
}
public void setWeight(Double weight) {
this.weight = weight;
}
public List<Object> getList() {
return list;
}
public void setList(List<Object> list) {
this.list = list;
}
}
/**
* 导演类:
* 入参是接口类
*
* */
public class CarBuilderDirector {
/**
* 构建充电车的时候,入参CarBuilder 为
* CarBuilder carBuilder=new ElectricBuilder();
*
*
* */
public void buildElectricCar(CarBuilder carBuilder){
carBuilder.charge();
carBuilder.startUp();
}
/**
* 构建加油车的时候,入参CarBuilder 为
* CarBuilder carBuilder=new GasolineBuilder();
*
* */
public void buildGasolineBuilder(CarBuilder carBuilder){
carBuilder.addGasoline();
carBuilder.startUp();
}
}