当我们去设计一个比较简单的类的构造方式时,一般情况下,直接重载几个不同参数的构造方法即可。但当类的成员变量比较多的时候,可能某些成员变量是必要的,某些又是可选的。有些是创建的时候需要传入的,有些又是对象创建完成之后才传的。这样的话重载构造方法的方式就会让人感到很迷茫,必须写一大堆注释来进行说明。这个时候,用Builder模式来进行对象的构建是十分合理的。
Builder模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
下面是标准Builder模式的类图。
我们在实际使用中往往使用的是改造过的Builder模式,经常会省略掉Director,直接在代码中使用Builder模式来创建对象,在这里我们自己充当了Director的角色。下面自己来实现一个最简单的Builder模式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| public class Person { private String id; private String name; private String sex; private int age; private String phoneNumber; private String email; private String address; private String occupation; private Person(Builder builder) { this.id = builder.id; this.name = builder.name; this.sex = builder.sex; this.age = builder.age; this.phoneNumber = builder.phoneNumber; this.email = builder.email; this.address = builder.address; this.occupation = builder.occupation; } static class Builder { private String id; private String name; private String sex; private int age; private String phoneNumber; private String email; private String address; private String occupation; public Builder(String id, String name, String sex, int age) { this.id = id; this.name = name; this.sex = sex; this.age = age; } public Builder setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; return this; } public Builder setEmail(String email) { this.email = email; return this; } public Builder setAddress(String address) { this.address = address; return this; } public Builder setOccupation(String occupation) { this.occupation = occupation; return this; } public Person build() { return new Person(this); } } }
|
1 2 3 4 5 6 7 8 9 10
| public class TestBuilder { public static void main(String[] args) { // TODO Auto-generated method stub Person person = new Person.Builder("xxx", "Faker", "man", 22) .setAddress("Korea").setEmail("xxx@gmail.com") .setOccupation("lol").setPhoneNumber("12345678901").build(); } }
|
上面的例子很直观的反映出了Builder模式的核心内容,当我们想要创建Person对象时,哪些参数是必须的,哪些是可选的,一目了然。而且链式的调用方式可读性更佳。
在Android中最常见的Builder模式就是AlertDialog了吧,在平时的编码中经常打交道。还有开源框架okhttp也大量使用了Builder模式,相信用过的人肯定深有感触。