1.构造一个普通的bean:
public class Person {
private String name;
private int age;
private double height;
private double weight;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
}
2.在内部添加一个静态内部类,就是我们的builder:
public static class Builder {
private String name;
private int age;
private double height;
private double weight;
public Builder name(String name) {
this.name = name;
return this;
}
public Builder age(int age) {
this.age = age;
return this;
}
public Builder height(double height) {
this.height = height;
return this;
}
public Builder weight(double weight) {
this.weight = weight;
return this;
}
public Person build() {
return new Person(this);
}
}
从上面的代码中我们可以看到,我们在Builder类里定义了一份与Person类一模一样的变量,通过一系列的成员函数进行设置属性值,但是返回值都是this,也就是都是Builder对象,最后提供了一个build函数用于创建Person对象,返回的是Person对象,对应的构造函数在Person类中进行定义,也就是构造函数的入参是Builder对象,然后依次对自己的成员变量进行赋值,对应的值都是Builder对象中的值。此外Builder类中的成员函数返回Builder对象自身的另一个作用就是让它支持链式调用,使代码可读性大大增强。
3.Builder内部类返回外部类的私有构造函数 private Person (Builder builder) {
this.name = builder.name;
this.age = builder.age;
this.height = builder.height;
this.weight = builder.weight;
}
经过上面简单的三步,我们的builder就建设完成了,下面我们就可以使用了:
Person.Builder builder = new Person.Builder();
Person person = builder.age(12)
.name("buder")
.height(181)
.weight(80)
.build();
打印log可以看到属性都设置成功:
常见使用builder模式的地方:
1.Android中对话框的创建
2.java中的StringBuilder和StringBuffer
3.著名的网络请求框架OkHttp 的request请求和响应
可见各大框架中大量的运用了Builder模式。最后总结一下
- 定义一个静态内部类Builder,内部的成员变量和外部类一样
- Builder类通过一系列的方法用于成员变量的赋值,并返回当前对象本身(this)
- Builder类提供一个build方法或者create方法用于创建对应的外部类,该方法内部调用了外部类的一个私有构造函数,该构造函数的参数就是内部类Builder
- 外部类提供一个私有构造函数供内部类调用,在该构造函数中完成成员变量的赋值,取值为Builder对象中对应的值
项目的实例:https://github.com/buder-cp/base_component_learn/tree/master/buildermodel
参考:https://www.cnblogs.com/android-blogs/p/5530239.html