建造者模式实用于对象属性太多的状况
有一个属性十分多的类: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模式
规范写法
- 形象建造者,个别是一个接口,蕴含创立产品对象的办法
- 导演者,调用具体建造者,创立产品对象
- 具体建造者
- 生成产品对象
这种写法长处繁琐,日常工作中根本很少用到。
个别写法
个别写法省去了形象建造者
和导演者
,采纳动态外部类的形式来创立建造者
。
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();}