乐趣区

关于java:建造者Builder模式

建造者模式实用于对象属性太多的状况

有一个属性十分多的类:Person

public class Person {
    
    private String a;
    private String b;
    private String c;
    private String d;
    private String e;
    private String f;
    private String g;
    private String h;
    private String i;
    private String j;
    
    // get/set 办法
    
    // 构造方法 1
    // 构造方法 2
    // 构造方法 3
    // 构造方法 4
    // 构造方法 5
    // 构造方法 6
    
}

Person类的属性十分多,咱们在创立不同属性的 Person 的时候,须要写很多的构造方法来应答不同的场景,这样代码十分臃肿,解决办法有两个,一个是采纳 BeanSet 形式,一个就是应用 Build 模式。

BeanSet 形式

public class Person {
    
    private String a;
    private String b;
    private String c;
    private String d;
    private String e;
    private String f;
    private String g;
    private String h;
    private String i;
    private String j;
    
    public void setA(String a) {this.a = a;}
    
    // ......
    
}

这种 BeanSet 形式是罕用的形式,当初插件行业很发达,赫赫有名的 Lombok 主动为咱们生成了 get 和 set 办法,这样省去了咱们写 get 和 set 办法的工夫,代码显得很洁净,然而,在咱们创建对象的时候,不得不这样:

    public static void main(String[] args) {Person person = new Person();
        person.setA("");
        person.setB("");
        person.setC("");
        person.setD("");
        person.setE("");
        person.setF("");
        person.setG("");
        person.setH("");
        person.setI("");
        person.setJ("");
    }

这样写没故障,但总感觉差那么一点啊。

Builder 模式

规范写法

  1. 形象建造者,个别是一个接口,蕴含创立产品对象的办法
  2. 导演者,调用具体建造者,创立产品对象
  3. 具体建造者
  4. 生成产品对象

这种写法长处繁琐,日常工作中根本很少用到。

个别写法

个别写法省去了 形象建造者 导演者 ,采纳动态外部类的形式来创立 建造者

public class User {

    private String name;

    private Integer age;

    private String gender;

    private String mobile;

    private String idCard;

    private String address;

    private User(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.gender = builder.gender;
        this.mobile = builder.mobile;
        this.idCard = builder.idCard;
        this.address = builder.address;
    }

    public static class Builder {

        /**require**/
        private final String name;

        private final Integer age;

        /**optional**/
        private String gender;

        private String mobile;

        private String idCard;

        private String address;

        public Builder(String name, Integer age) {
            this.name = name;
            this.age = age;
        }

        public Builder gender(String gender) {
            this.gender = gender;
            return this;
        }

        public Builder mobile(String mobile) {
            this.mobile = mobile;
            return this;
        }

        public Builder idCard(String idCard) {
            this.idCard = idCard;
            return this;
        }

        public Builder address(String address) {
            this.address = address;
            return this;
        }

        public User build() {return new User(this);
        }

    }

}

应用形式

public static void main(String[] args) {User use = new Builder("zhangsan", 12).address("beijing").build();}
退出移动版