Builder模式:为了构造复杂的对象,提升代码的可读性以及可维护性而创造的一种设计模式,在安卓开发中使用很多。
在构造一个对象时一般有两种方法:
①定义私有的成员变量,提供set/get方法;
②定义多参数的有参构造器,通过有参构造实例化不同参数需求的对象。
有参构造的缺点很明显,在属性较多时需要提供大量有参构造,且可读性很差;
传统构造pojo对象提供set/get方法的途径应用较多,可读性也很好,但是在开发中我们也许会在为所有想要的属性set值前就使用了这个对象(这个...还是看人吧,大老粗也许会犯),对于存在不可变参数(final)的类无可奈何。'
上面两种构造方法在复杂对象面前都稍显不足,我们引入Builder模式来解决这个问题:
Builder模式是增加了代码量来换取代码的可读性和维护性,基本思想是在待构建对象类中创建一个静态内部类提供set方法,我们在赋值时就可以通过串联调用就简单明了多了~
建造者模式步骤:
1.创建一个类,提供私有成员变量,提供get方法(可选);
2.创建一个名为Builder的静态内部类,提供和外部类对应的私有成员变量;
3.静态内部类中提供类似get方法,不同的是方法返回Builder对象:
4.静态内部类中提供返回值类型为外部类类型的build方法,创建一个外部类对象传参Builder对象:
5.外部类中提供参数为Builder的私有有参构造,将Builder对象中的值传到外部类中。
demo:
package builder;
/**
* 建造者模式:
* 通过静态内部类中提供的set方法和外部类中提供的带有内部类参数的构造 提供常见对象的可读性
* 缺点是书写复杂
* 创建对象通过链式调用简单易见
* @author malaganguo
*
*/
public class User {
private int id ;
private String firstName;
private String lastName;
private int age;
private String phone;
private String address;
//外部类提供所有的get方法
public int getId() {
return id;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
public String getPhone() {
return phone;
}
public String getAddress() {
return address;
}
public static class Builder {
//Builder类中同样提供对应成员变量
private int id ;
private String firstName;
private String lastName;
private int age;
private String phone;
private String address;
public Builder id(int i) {
id = i;
return this;
}
public Builder firstName(String f) {
firstName = f;
return this;
}
public Builder lastName(String l) {
lastName = l;
return this;
}
public Builder age(int a) {
age = a;
return this;
}
public Builder phone(String p) {
phone = p;
return this;
}
public Builder address(String a) {
address = a;
return this;
}
public User build() {
return new User(this);
}
}
private User(Builder builder) {
id = builder.id;
firstName = builder.firstName;
lastName = builder.lastName;
age = builder.age;
phone = builder.phone;
address = builder.address;
}
@Override
public String toString() {
return "User [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", age=" + age + ", phone="
+ phone + ", address=" + address + "]";
}
}
测试类:
package builder;
public class Test {
public static void main(String[] args) {
User zyf = new User.Builder().id(1).firstName("zhang").lastName("yifei").phone("18888888888").address("xupt").build();
System.out.println(zyf.getId()+"-"+zyf.getFirstName()+"-"+zyf.getLastName());
System.out.println(zyf.toString());
}
}
测试结果:
可以看到:建造者模式可以链式赋值简单明了。 build模式可以通过build对象返回需要创建的对象。
Build模式在安卓源码中应用很多,弹窗事件就是一个build模式的例子:
AlertDialog.Builder builder=new AlertDialog.Builder(this);
AlertDialog dialog=builder.setTitle("标题")
.setIcon(android.R.drawable.ic_dialog_alert)
.setView(R.layout.myview)
.setPositiveButton(R.string.positive, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setNegativeButton(R.string.negative, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.create();
dialog.show();