Builder(构建者)模式的定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的展示。
为什么要用构建者模式?
1.简单的new 对象实例的方法,是难写、难读、难维护,对象属性多了就要重叠构造器如
new User(name);
new User(name,age);
new User(name,age,sex);
......
code中常有一个类有多个构造函数,构造函数的参数个数一般递增,层层调用,我们叫他重叠构造器模式
2.简单的javaBean,虽然易维护,但是很难保持一致
优点:JavaBean可以避免传参数不知道对应哪个字段、修改参数类型容易对应错的问题。
JavaBean的setter方法中明确了对应的字段和类型,省去了重叠构造方法。
缺点:
JavaBean对象可以随时调用setter方法进行设置,这会让Bean缺乏一致性、也就是类的实例的一致性没法保证了。在多线程情况下,会出现很难分析的bug
3.Builder模式解决了JavaBean一致性的问题,
在Bean中创建静态内部Builder类,使用Builder中类似setter的方法设置对应的属性给Builder。然后通过public Bean build(){}方法,实例化Bean对象并返回给客户调用者,重要的是这个Bean对象是确定下来的, 而且Builder模式的灵活性,可以通过不同的setter生成多个自定义的Bean对象。
写Builder模式的步骤有四步:
a.定义一个静态内部类Builder,内部的成员变量和外部类一样
b.Builder类通过一系列的方法用于成员变量的赋值,并返回当前对象本身(this)
c.Builder类提供一个build方法或者create方法用于创建对应的外部类,该方法内部调用了外部类的一个私有构造函数,该构造函数的参数就是内部类Builder
d.外部类提供一个私有构造函数供内部类调用,在该构造函数中完成成员变量的赋值,取值为Builder对象中对应的值
例子:
public class UserBuilderTest {
private String name;//四个属性与UserBuilder内部类的属性一致
private String age;
private String sex;
private String birday;
private UserBuilderTest(UserBuilder builder) {//私有化的构造,只能通过UserBuilder.builder方法去new
this.name = builder.name;//把内部类中的属性赋值给外部类的成员变量
this.age = builder.age;
this.sex = builder.sex;
this.birday = builder.birthday;
}
public String getName() {
return name;
}
public String getAge() {
return age;
}
public String getSex() {
return sex;
}
public String getBirday() {
return birday;
}
public static class UserBuilder {//静态内部类
private String name;//四个属性与外部类的属性一致
private String age;
private String sex;
private String birthday;
public UserBuilder name(String name) {
this.name = name;
return this;
}
public UserBuilder age(String age) {
this.age = age;
return this;
}
public UserBuilder sex(String sex) {
this.sex = sex;
return this;
}
public UserBuilder birthday(String birthday) {
this.birthday = birthday;
return this;
}
public UserBuilderTest build() {//new 实例
return new UserBuilderTest(this);
}
}
}
参考:https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/builder/mr.simple
http://www.jianshu.com/p/e2a2fe3555b9
http://www.jianshu.com/p/a281944e7d18