android 创建者(builder)模式

来源:互联网 发布:自学素描的软件 编辑:程序博客网 时间:2024/05/22 11:54

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();
原创粉丝点击