持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情。
建造者模式
简介
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,提供了一种创建对象的方式。
应用场景
创建一个对象的步骤复杂,但是创建对象的流程不变或者相似。
普通创建对象的方式
在不适用建造者模式的情况下,一般都是使用构造器去实现,但是如果说一个对象的属性较多,构造器的参数就会很长,这样就降低了代码可读性,也使得维护困难。
这里有一个新能源汽车类,创建它我们一般有两种方式
public class GreenCar {
//电机
private String motor;
//电池
private String battery;
//电控
private String electronicControl;
//品牌
private String brand;
/**上面必须、下面选配*/
//是否自持自动驾驶
private Boolean autopilot;
}
- 方式一,折叠构造函数。也是常用的
public GreenCar(String motor, String battery, String electronicControl, String brand, Boolean autopilot) {
this.motor = motor;
this.battery = battery;
this.electronicControl = electronicControl;
this.brand = brand;
this.autopilot = autopilot;
}
public GreenCar(String motor, String battery, String electronicControl, String brand) {
this(motor,battery,electronicControl,brand,false);
}
- 方式二:JavaBean,getter\setter。先new一个空参对象,通过set赋值。
对于setter的方式,可以使用链式编程优化。
public GreenCar() {
}
public void setMotor(String motor) {
this.motor = motor;
}
public void setBattery(String battery) {
this.battery = battery;
}
public void setElectronicControl(String electronicControl) {
this.electronicControl = electronicControl;
}
public void setBrand(String brand) {
this.brand = brand;
}
public void setAutopilot(Boolean autopilot) {
this.autopilot = autopilot;
}
以上两种方式都存在弊端,属性过多,不好用。
建造者模式
四个角色
- Product:产品,最终返回的实例。
- Builder:建造者的抽象基类。定义类创建产品实例的具体步骤(实现类需要实现)。
- ConcreateBuilder:Builder实现类
- Director:指导建造者(Builder)创建产品的算法。
产品-新能源汽车
public class GreenCar {
private String motor;
private String battery;
private String electronicControl;
private String brand;
private Boolean autopilot;
public GreenCar(String brand) {
this.brand = brand;
}
public void setMotor(String motor) {
this.motor = motor;
}
public void setBattery(String battery) {
this.battery = battery;
}
public void setElectronicControl(String electronicControl) {
this.electronicControl = electronicControl;
}
public void setAutopilot(Boolean autopilot) {
this.autopilot = autopilot;
}
}
抽象建造者
public interface IBuilder {
void setMotor();
void setBattery();
void setElectronicControl();
void setAutopilot();
GreenCar build();
}
比亚迪
public class BYDBuilder implements IBuilder{
private GreenCar greenCar;
public BYDBuilder() {
this.greenCar = new GreenCar("比亚迪,海豹");
}
@Override
public void setMotor() {
greenCar.setMotor("比亚迪电机");
}
@Override
public void setBattery() {
greenCar.setBattery("刀片电池");
}
@Override
public void setElectronicControl() {
greenCar.setElectronicControl("比亚迪电控");
}
@Override
public void setAutopilot() {
greenCar.setAutopilot(true);
}
@Override
public GreenCar build() {
return greenCar;
}
}
特斯拉
public class TSLBuilder implements IBuilder{
private GreenCar greenCar;
public TSLBuilder() {
this.greenCar = new GreenCar("特斯拉");
}
@Override
public void setMotor() {
greenCar.setMotor("特斯拉电机");
}
@Override
public void setBattery() {
greenCar.setBattery("大头电池");
}
@Override
public void setElectronicControl() {
greenCar.setElectronicControl("特斯拉电控");
}
@Override
public void setAutopilot() {
greenCar.setAutopilot(false);
}
@Override
public GreenCar build() {
return greenCar;
}
}
指导生产类
public class GreenCarDirector {
//指导产品创建算法
public void makeGreenCar(IBuilder builder){
builder.setAutopilot();
builder.setBattery();
builder.setElectronicControl();
builder.setMotor();
}
}
测试
客户端只要创建对应建造者,就可以获取实例对象
@Test
public void test(){
//创建一个指导,生产类
GreenCarDirector greenCarDirector = new GreenCarDirector();
//创建比亚迪构建者
IBuilder bydBuilder = new BYDBuilder();
//创建比亚迪构建者
IBuilder tslBuilder = new TSLBuilder();
//生产比亚迪
greenCarDirector.makeGreenCar(bydBuilder);
GreenCar greenCar1 = bydBuilder.build();
System.out.println(greenCar1.toString());
//生产特斯拉
greenCarDirector.makeGreenCar(tslBuilder);
GreenCar greenCar2 = tslBuilder.build();
System.out.println(greenCar2.toString());
}
建造者模式的使用
lombok提供的@Builder注解,使得类支持建造者模式创建。
不过lombok提供的建造者模式,将创建对象的算法给到客户端实现,看起来没那么便利,但是对于代码结构来说,更清晰,可读性更好。