android 创建者(builder)模式
builder模式
属创建型模式,它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
使用场景:
相同的方法,不同的执行顺序,产生不同的事件结果时;
多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时;
产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适;
形如OkHttp对象、Retrofit对象创建:
OkHttp对象的创建
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cache(getCache())
.addInterceptor(new HttpCacheInterceptor())
.addInterceptor(new LogInterceptor())
.addNetworkInterceptor(new HttpRequestInterceptor())
.build();
Retrofit对象的创建
Retrofit retrofit = new Retrofit.Builder()
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.baseUrl(BASE_URL)
.build();
OkHttpClient原型类(精简builder框架):
public class OkHttpClient implements Cloneable, Call.Factory {
...
final Dispatcher dispatcher;
...
final int writeTimeout;
public OkHttpClient() {
this(new Builder());
}
private OkHttpClient(Builder builder) {
this.dispatcher = builder.dispatcher;
...
this.writeTimeout = builder.writeTimeout;
}
public Builder newBuilder() {
return new Builder(this);
}
public static final class Builder {
Dispatcher dispatcher;
...
int writeTimeout;
public Builder() {
dispatcher = new Dispatcher();
...
writeTimeout = 10_000;
}
Builder(OkHttpClient okHttpClient) {
this.dispatcher = okHttpClient.dispatcher;
...
this.writeTimeout = okHttpClient.writeTimeout;
}
public OkHttpClient build() {
return new OkHttpClient(this);
}
}
}
builder模式一般程序结构形式(可以很灵活):
public class Student {
private final String mName; //属性声明为final(Student类是不可变的)
private final int mAge;
private final String mGender;
//Student类构造方法是私有的,不可以直接通过new来创建,对属性值只提供getter方法
private Student(Builder builder) {
mName = builder.mName;
mAge = builder.mAge;
mGender = builder.mGender;
}
public String getmName() {
return mName;
}
public int getmAge() {
return mAge;
}
public String getmGender() {
return mGender;
}
public static final class Builder {
private String mName;
private int mAge;
private String mGender;
public Builder(String name, int age, String gender) {
mName = name;
mAge = age;
mGender = gender;
}
public Builder(Student student) {
mName = student.mName;
mAge = student.mAge;
mGender = student.mGender;
}
public Builder mName(String val) {
mName = val;
return this;
}
public Builder mAge(int val) {
mAge = val;
return this;
}
public Builder mGender(String val) {
mGender = val;
return this;
}
public Student build() {
//静态内部类build方法,传入自身的引用给外部类带参构造函数实现外部类的实例化
return new Student(this);
}
}
}
Student student0 = new Student.Builder("王小明", 7, "") // 演示用法而已
.mGender("女")
.build();
Student student1 = new Student.Builder(student0)
.build();