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

有一个属性十分多的类: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();}