1.变种builder模式是什么
以下一段话套自“顾浩鑫”的《android高级进阶》。
经典的builder模式重点在于抽象出对象创建的步骤,病通过调用不通的具体实现从而得到不通的结果,而变种模式的目的在于减少对象创建过程中引入的多个重载构造函数、可选参数以及setters过度使用导致的不必要的复杂性。
2. 变种builder有什么好处
2.1 重载构造函数
即采用多个函数重载的方式进行初始化
public class Person {
private final String name;//必传
private final String sex;//必传
private final String age;
private final int height;
public Person(String name, String sex) {
this(name, sex, "");
}
public Person(String name, String sex, String age) {
this(name, sex, age, 0);
}
public Person(String name, String sex, String age, int height) {
this.name = name;
this.sex = sex;
this.age = age;
this.height = height;
}
}
特别常见的一套方法,在安卓api中,也有很多这种方法。但它伴随着一些缺点
我初始化的是name,sex,height的情况,那就没有这个构造函数,如果我非要加上去,那也可以,但是当成员变量多起来之后,嘿嘿嘿!
所以它适用于一些参数比较少的场景
2.2 使用getter和setter
ps:使用快捷键alt+n/cmd+n可以快速自动生成get和set方法
或者右键,generate,来生成
public class Person {
private String name;//必传
private String sex;//必传
private String age;
private int height;
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;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}
啊哈,又很常见啦。虽然它让赋值函数可以随意搭配,但是它有个重大缺点,放弃了final修饰符
2.3 变种builder
public class Person {
private final String name;//必传
private final String sex;//必传
private final String age;
private final int height;
private Person(Builder builder) {
name = builder.name;
sex = builder.sex;
age = builder.age;
height = builder.height;
}
public static final class Builder {
private String name;
private String sex;
private String age;
private int height;
public Builder(String name, String sex) {
this.name = name;
this.sex = sex;
}
public Builder age(String val) {
age = val;
return this;
}
public Builder height(int val) {
height = val;
return this;
}
public Person build() {
return new Person(this);
}
}
}
代码中使用
Person person = new Person.Builder("name", "girl")
.age("21")
.height(170)
.build();
3 比较
- 比如它相较于第一种方法,都是有安全判定的(初始化必须传名字和性别),但是后者明显减少代码量,而且易读。因为第一种随着变量增加,构造方法会呈几何式叠加
- 而相较于第二种方法,第二种没有安全判定,全凭开发者自己遵守自己的代码习惯与规范,而且它放弃了final修饰符
4 自动化builder生成
一句话总结:搜索”InnerBuilder”插件,重启studio,alt+n/cmd+n,选择builder(可以注意一下弹出来界面上的选项)