Buidler模式的定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。貌似这个定义并没有什么卵用,因为还是看不明白啥是Builder模式。
我的理解就是Builder模式是想要什么就添加什么,很灵活
下面看一段代码:
Retrofit retrofit=new Retrofit.Builder()
.baseUrl(baseUrl)
.client(new OkHttpClient())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
return retrofit;
是不是很熟悉的感觉,创建一个Retrofit的对象的时候就是用的Builder模式。那么为什么要用Builder模式呢,优点在哪里呢?
- 链式结构,看起来很清爽
- 灵活:我需要添加client()方法我可以直接去添加,而且不需要关心顺序问题,也可以把这个方法写在baseurl()之前的
接下来我们自己来写一个Builder模式的类:
public class Person {
private String name;
private int age;
private String address;
private Person(Builder builder) {
this.name = builder.name;
this.age = builder.age;
this.address = builder.address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static class Builder {
private String name;
private int age;
private String address;
public Builder addName(String name) {
this.name = name;
return this;
}
public Builder addAge(int age) {
this.age = age;
return this;
}
public Builder addAddress(String address) {
this.address = address;
return this;
}
public Person builder() {
return new Person(this);
}
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
这就是一个简单的Person实体类,有三个属性,分别为name、age、address。在Person的构造方法里传了一个Builder静态内部类,在Builder这个类里面添加了3个方法,分别是addName(String name)、addAge(int age)、addAddress(String address).而且在这三个方法都是返回一个Builder。 最后再看看builder()方法,在这里是返回最终的Person类;所以在初始化这个对象的时候,只需要将我们要添加的东西添加进去,最后调用Builer的builder()方法就能得到对象啦。
在其他地方初始化Person:
Person.Builder builder=new Person.Builder();
Person person = builder.addName("张三")
.addAge(22)
.addAddress("上海市,普陀区")
.builder();
Log.d(TAG, "onCreate() returned: " + person.toString());
这样就可以了,最后再看一下打印结果:
11-29 01:59:31.641 3127-3127/me.gcg.builder D/MainActivity: onCreate() returned: Person{name='张三', age=22, address='上海市,普陀区'}