构建者模式

作者:碳水怪兽👾 发布于:2021/10/17

构建者模式的定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

什么时候需要构建者模式

如果一个类的属性过多,会导致其构造函数的参数列表过长,假如有些属性是非必填,可能导致产生很多重载的构造函数

案例

假如现在有一个空房子等着装修,我们需要添置各种家具和电器(比如说床、洗衣机、空调、冰箱),下面的House类的构造函数,实际上我们的属性远不止这些,

,属性过多就会导致构造函数参数列表过长,同时有些属性是非必须的,也会导致产生多个构造函数。

未使用构建者模式时:

    public House(String bed, String airConditioner, String washingMachine, String refrigerator) {
        this.bed = bed;
        this.airConditioner = airConditioner;
        this.washingMachine = washingMachine;
        this.refrigerator = refrigerator;
    }

    //不要冰箱
    public House(String bed, String airConditioner, String washingMachine) {
        this.bed = bed;
        this.airConditioner = airConditioner;
        this.washingMachine = washingMachine;

    }

 House h1 = new House("1.6 * 2.2","格力","海尔","美的");
 House h2 = new House("1.6 * 2.2","格力","海尔");


重构后:

package top.zw.learn.creation.builder;

public class House {

    private String bed;

    private String airConditioner;

    private String washingMachine;

    private String refrigerator;

    public House(Builder builder) {
        this.bed = builder.bed;
        this.airConditioner = builder.airConditioner;
        this.washingMachine = builder.washingMachine;
        this.refrigerator = builder.refrigerator;
    }

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("House{");
        sb.append("bed='").append(bed).append('\'');
        sb.append(", airConditioner='").append(airConditioner).append('\'');
        sb.append(", washingMachine='").append(washingMachine).append('\'');
        sb.append(", refrigerator='").append(refrigerator).append('\'');
        sb.append('}');
        return sb.toString();
    }

    private static class Builder {

        private String bed;

        private String airConditioner;

        private String washingMachine;

        private String refrigerator;

        private Builder bed(String bed){
            this.bed = bed;
            return this;
        }

        private Builder airConditioner(String airConditioner){
            this.airConditioner = airConditioner;
            return this;
        }

        private Builder washingMachine(String washingMachine){
            this.washingMachine = washingMachine;
            return this;
        }

        private Builder refrigerator(String refrigerator){
            this.refrigerator = refrigerator;
            return this;
        }

        private House build(){
            return new House(this);
        }


    }

    public static void main(String[] args) {
        House house1 = new Builder()
                .bed("1.6 * 2.2")
                .airConditioner("格力")
                .refrigerator("海尔")
                .washingMachine("美的")
                .build();

        House house2 = new Builder()
                .bed("1.8 * 2.2")
                .airConditioner("格力")
                .refrigerator("海尔")
                .build();
        
        System.out.println(house1);
        System.out.println(house2);
    }
    
}

上面的代码也印证了构建者模式同样的构建过程可以创建不同的表示。

构建者模式的应用

  • SpringBatch#JobFactory
  • Mybatis#XmlConfigBuilder