Builder模式在Android开发中也很常用,通常我们在构建一个复杂的对象的时候会使用此模式,可以将复杂对象的构建和它的表示分离。
特点:
Builder模式通常为链式调用,关键点在于每个set方法都返回自身,也就是return this.
代码示例:
如果我们要构建一个学生对象,要给这个学生设置年龄,性别,身高等参数
public class Student {
private String name;
private String sex;
private String age;
public Student() {
}
public Student(String name, String sex, String age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age='" + age + '\'' +
'}';
}
}
builder类:
public class StudentBuilder {
private String name;
private String sex;
private String age = "";
private StudentBuilder() {//将StudentBuilder的构造函数私有化,使外部不能访问内部属性,用户
//唯一能够设置属性的地方就是通过Builder对象,也就是用户只能通过Builder对象构造StudentConfig对象
//这就是构建和表示相分离
}
public static class Builder {
private String name;//必传参数
private String sex;//必传参数
private String age = "";//可选参数
public Builder setName(String name) {
this.name = name;
return this;//返回自身是实现链式调用的关键
}
public Builder setSex(String sex) {
this.sex = sex;
return this;
}
public Builder setAge(String age) {
this.age = age;
return this;
}
public Student create() {
Student student = new Student();
student.setAge(age);
student.setName(name);
student.setSex(sex);
return student;
}
}
}
使用和不使用builder模式对比:
//传统方式1 构造函数传参,适用于参数少的对象
Student student1 = new Student("xiaoxiao", "女", "19");
//传统方式2 挨个传参
Student student2 = new Student();
student2.setName("小小");
student2.setSex("女");
student2.setAge("19");
//Builder模式
Student student3 = new StudentBuilder.Builder()
.setAge("19")
.setName("xiaoxiao")
.setSex("女")
.create();
当对象很复杂,参数类型比较多的时候,使用builder模式的链式调用会更清晰。