下一篇 OkHttp设计模式剖析(二)责任链模式
OKHTTP:
由大名鼎鼎的Square公司开发的网络通信库。
设计模式:
软件开发中问题的解决套路。
建造者模式简介
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式将一个复杂对象的创建过程封装起来,允许对象通过多个步骤来创建,并且可以改变过程。尤其是在对象特别复杂,内部参数及其多的时候,建造者模式就能发挥出它的优势。
若源代码中有Builder这个词,大概率使用了建造者模式。
OkHttpClient类中的建造者模式
OkHttpClient就是一个内部及其复杂的对象,内部包含一系列超时时间(Timeout),代理(proxy),缓存(cache),分发器(dispatcher),拦截器(interceptors)等等。当然,我们常用的就只有默认模式。
public class OkHttpClient implements Cloneable, Call.Factory, WebSocketCall.Factory {
// 构造函数1
public OkHttpClient() {
this(new Builder()); // 调用构造函数1
}
// 构造函数2
private OkHttpClient(Builder builder) {
......
}
public Builder newBuilder() {
return new Builder(this);
}
// Builder类
public static final class Builder {
public Builder() { }
Builder(OkHttpClient okHttpClient) { }
//Builder类的OkHttpClient
public OkHttpClient build() {
return new OkHttpClient(this);
}
}
}
利用建造者模式实例化OkHttpClient对象
// 实例化一个默认的HTTP客户端
OkHttpClient client = new OkHttpClient();
// 使用自定义设置创建HTTP客户端实例
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new HttpLoggingInterceptor()) //增加拦截器
.cache(new Cache(cacheDir, cacheSize)) //设置用于读取和写入缓存响应的响应缓存。
.build();
// 实例化一个500毫秒则超时的HTTP客户端实例
OkHttpClient eagerClient = client.newBuilder()
.readTimeout(500, TimeUnit.MILLISECONDS)
.build();
Request类中的建造者模式
public final class Request {
private Request(Builder builder) {
......
}
public Builder newBuilder() {
return new Builder(this);
}
public static class Builder {
private HttpUrl url;
public Builder() {
......
}
private Builder(Request request) {
this.url = request.url;
......
}
public Builder url(HttpUrl url) {}
public Builder header(String name, String value) {}
......
public Request build() {
if (url == null) throw new IllegalStateException("url == null");
return new Request(this);
}
}
}
Request中蕴含的建造者设计模式,可以让框架使用者自行组装所要发起的HTTP请求,通过Builder.url设置目的地址,通过Builder.head设置HTTP请求的头部。
基于建造者模式构建的其他代码
1、OkHttp框架中的Response类
2、Android源码中的AlertDialog类
麦当劳1+2随心配就是一个典型的建造者设计模式
RedWhite.png我们定义随心配类RedWhite,并在类中实现建造者Builder模式:
public class RedWhite{
String red;
String white;
//构造函数
public RedWhite(){
this(new Builder());
}
private RedWhite(Builder builder){
this.red = builder.red;
this.white = builder.white;
}
public String toString(){
return red+" + "+white;
}
//建造者
public static class Builder{
private String red;
private String white;
public Builder(){
this.red = "吉士堡";
this.white = "可乐";
}
private Builder(RedWhite redWhite){
this.red = redWhite.red;
this.white = redWhite.white;
}
public Builder setRed(String red){
this.red = red;
return this;
}
public Builder setWhite(String white){
this.white = white;
return this;
}
public RedWhite build(){
return new RedWhite(this);
}
}
}
我们用建造者来构建我们的随心配套餐:
public static void main(String[] args) {
RedWhite rw = new RedWhite();
System.out.println(rw); // 输出:吉士堡 + 可乐(默认)
RedWhite rw2 = new RedWhite.Builder()
.setRed("薯条").setWhite("雪碧")
.build();
System.out.println(rw2); // 输出:薯条 + 雪碧
}
所以,建造者设计模式的核心就是:自行组装。
参考文献
1、设计模式|菜鸟教程:https://www.runoob.com/design-pattern/design-pattern-tutorial.html
2、《Android源码设计模式解析与实战》何红辉,关爱民著
3、隔壁老李头:https://www.jianshu.com/p/82f74db14a18
网友评论