5)建造者模式
5.1)基本介绍
-
又叫生成器模式,是一种对象构建模式。它将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方式可以构造出不同属性的对象,只要指定内容和对象的类型和内容就可以构建他们,用户不需要知道内部的细节
-
角色:
- 产品角色:具体的产品对象
- 指挥者:生产产品
-
抽象建造者:负责产品的建造流程
- 具体建造者:负责产品的细节
5.2)注意事项
5.4)案例
- 需求说明:买一辆车,支持定制化,比如车的颜色、轮胎的材料、发动机缸数、座椅的材料…。现在需要购买一辆白色的、轮胎材料是防滑的、发动机缸数是v8、座椅的材料普通就可以
(1)普通
- 类图
-
代码
/** * @author xxl * @date 2023/5/10 */ public class BuilderVersion1 { public static void main(String[] args) { BWMCar bwmCar = new BWMCar(); bwmCar.setColor("白色"); bwmCar.setSeat("普通"); bwmCar.setTire("防滑"); bwmCar.setEngine(8); System.out.println(bwmCar); } @Data public static class BWMCar{ private String color; private String seat; private String tire; private int engine; @Override public String toString() { return "BWMCar{" + "color='" + color + '\'' + ", seat='" + seat + '\'' + ", tire='" + tire + '\'' + ", engine=" + "V" + engine + '}'; } } }
虽然这样很简单,但是如果需求不同就需要再创建对象这就会导致代码冗余且难看,如果是一个系列的对象且在细节上不同就有不同 的对象就可以使用建造者模式,反正这种创建很多的对象就可以考虑创建型模式
(2)建造者模式
- 新的需求:张三购买一辆白色的、轮胎材料是防滑的、发动机缸数是v4、座椅的材料普通
- 新的需求:李四购买一辆红色的、轮胎材料是普通的、发动机缸数是v12、座椅的材料真皮
- 新的需求:王五购买车,不自定义车
代码
/**
* @author xxl
* @date 2023/5/10
*/
public class BuilderPatenVersion2 {
public static void main(String[] args) {
BWMCar car1 = new CarBuilder().setColor("白色").setEngine(4).setTire("防滑").setSeat("普通").builder();
BWMCar car2 = new CarBuilder().setColor("红色").setEngine(12).setTire( "普通").setSeat("真皮").builder();
BWMCar car3 = new CarBuilder().builder();
System.out.println("张三购买车->"+car1);
System.out.println("李四购买车->"+car2);
System.out.println("王五购买车->"+car3);
}
public static class CarBuilder{
private BWMCar car = null;
public CarBuilder() {
//创建默认的对象,假如有些属性未设置,就需要默认属性因为不可能是空的
car = new BWMCar("白色","普通","普通",6);
}
public CarBuilder setColor(String color) {
car.setColor(color);
return this;
}
public CarBuilder setSeat(String seat) {
car.setSeat(seat);
return this;
}
public CarBuilder setTire(String tire) {
car.setTire(tire);
return this;
}
public CarBuilder setEngine(int engine) {
car.setEngine(engine);
return this;
}
public BWMCar builder() {
return car;
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class BWMCar{
private String color;
private String seat;
private String tire;
private int engine;
@Override
public String toString() {
return "BWMCar{" +
"color='" + color + '\'' +
", seat='" + seat + '\'' +
", tire='" + tire + '\'' +
", engine=" + "V" + engine +
'}';
}
}
}