设计模式--建造者模式

141 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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());
}

image-20220604143306907.png

建造者模式的使用

lombok提供的@Builder注解,使得类支持建造者模式创建。

不过lombok提供的建造者模式,将创建对象的算法给到客户端实现,看起来没那么便利,但是对于代码结构来说,更清晰,可读性更好。