OkHttp中的设计模式之一:Builder模式

  • 1. 什么是Builder模式
  • 2. OkHttp中的实例
    • 2.1 OkHttpClient的构建方式
    • 2.2 OkHttpClient中的Builder
      • 2.2.1 通过Builder构建一个OkHttpClient
      • 2.2.2 默认的Builder
      • 2.2.3 反构建Builder
        • 2.2.3.1 反构建的作用
        • 2.2.3.2 反构建的实际应用
  • 3. Tips
    • 3.1 Builder插件

1. 什么是Builder模式

关于什么是builder模式,具体可以参考一下这篇文章。
Builder模式分为:经典builder模式和变种builder模式。而在Android项目中,一般使用的都是变种Builder模式,OkHttp中也例外。不管是OkHttpClient还是Request,都是通过变种Builder模式进行构建的。下面来我们来看一下OkHttp的源码,来感受一下Builder模式的应用。

2. OkHttp中的实例

OkHttp中很多类都有用到Builder模式,使用上都大同小异,所以下面就以OkHttpClient为例子,来讲一下Builder模式在OkHttp中的应用。

2.1 OkHttpClient的构建方式

构建OkHttpClient有两种方式:

//方式1
OkHttpClient client1 = new OkHttpClient();//方式2
OkHttpClient client2 = new OkHttpClient.Builder().writeTimeout(1000, TimeUnit.MILLISECONDS).readTimeout(1000, TimeUnit.MILLISECONDS).addInterceptor(new Interceptor() {@Overridepublic Response intercept(Chain chain) throws IOException {return null;}}).build();}

方式2很明显,一看就是通过Builder模式构建的。但是实际上,方式1内部也是通过调用了new Builder()的方式通过构建了一个默认参数的OkHttpClient

public OkHttpClient() {this(new Builder());}

2.2 OkHttpClient中的Builder

2.2.1 通过Builder构建一个OkHttpClient

OkHttpClient(Builder builder) {this.dispatcher = builder.dispatcher;this.proxy = builder.proxy;this.protocols = builder.protocols;this.connectionSpecs = builder.connectionSpecs;this.interceptors = Util.immutableList(builder.interceptors);this.eventListenerFactory = builder.eventListenerFactory;if (builder.sslSocketFactory != null || !isTLS) {this.sslSocketFactory = builder.sslSocketFactory;this.certificateChainCleaner = builder.certificateChainCleaner;} else {X509TrustManager trustManager = Util.platformTrustManager();this.sslSocketFactory = newSslSocketFactory(trustManager);this.certificateChainCleaner = CertificateChainCleaner.get(trustManager);}//还有一堆参数...
}

这个没啥好说的,就是将builder中设置过的参数一一赋值给OkHttpClient,然后可能还会做一些判断处理,保证参数的合法性

2.2.2 默认的Builder

public Builder() {dispatcher = new Dispatcher();protocols = DEFAULT_PROTOCOLS;connectionSpecs = DEFAULT_CONNECTION_SPECS;followRedirects = true;retryOnConnectionFailure = true;callTimeout = 0;connectTimeout = 10_000;readTimeout = 10_000;writeTimeout = 10_000;pingInterval = 0;//还有一堆参数...}

在2.1 OkHttpClient的构建方式中我们知道,OkHttpClient的默认构造函数中就调用了Builder()方式。在我们自己的项目中,也可以通过这种方式设置默认的参数,特别是一些必选项,防止因为调用者没有设置必选参数而出现问题。

OkHttpClient client1 = new OkHttpClient();public OkHttpClient() {this(new Builder());}

2.2.3 反构建Builder

2.2.3.1 反构建的作用

public Builder newBuilder() {return new Builder(this);}Builder(OkHttpClient okHttpClient) {this.dispatcher = okHttpClient.dispatcher;this.proxy = okHttpClient.proxy;this.protocols = okHttpClient.protocols;this.connectionSpecs = okHttpClient.connectionSpecs;this.interceptors.addAll(okHttpClient.interceptors);//还有一堆参数...}

个人理解,反构建Builder最主要的使用场景就是:当使用者构建了OkHttpClient之后发现有一些参数需要改变,所以就可以通过反构建一个Builder,然后调用Builder的set方法修改对应的参数在build一次,生成新的OkHttpClient对象。
当然,假如OkHttpClient中有参数对应的set方法(实际上并没有),也是能修改参数的。但是这就违背了Builder模式的设计原则,而且会引发一些问题:

1、比如我想重新设置OkHttpClientsslSocketFactory参数,使用Builder模式时,在生成OkHttpClient的时候是会做参数校验的(见2.1.1)。但是如果直接通过OkHttpClient的set方法的形式,这个参数校验就会显得很麻烦,要在sslSocketFactorycertificateChainCleaner的set方法中都做一次校验。
2、这是我认为更关键的一个点:如果我们需要同时修改多个参数,并希望它们同时生效。在多线程高并发的情况下,很可能我们在获取参数配置的时候,只有部分参数是修改过的,还有部分参数是原来的值,这会引发很多不可预估的问题。

2.2.3.2 反构建的实际应用

在使用Interceptor时,我们经常会使用到Request的反构建,例如:

public Response intercept(Chain chain) throws IOException {Request request = chain.request();//先走p2p请求,如果失败了,再走原始url请求。Response response = chain.proceed(request.newBuilder().url(p2pUrl).build());if (response.isSuccessful()) {return response;}return chain.proceed(request);}

3. Tips

3.1 Builder插件

手打Builder是一件非常痛苦的事情。不会偷懒的程序员不是好的程序员:),所以我们可以通过Builder插件来帮助我们自动化生成Builder。插件的名字叫做InnerBuilder。可以在File–>Settings–>Plugins中搜索"InnerBuilder"下载。

使用时,只需要在类的空白处按下快捷键Alt + Insert就可以看到Builder的选项。点击后,插件就会帮助我们自动化生成一个Builder了~

OkHttp中的设计模式之一:Builder模式相关推荐

  1. Android设计模式之——Builder模式

    一.介绍 Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构造流程.该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程 ...

  2. Android常用设计模式之Builder模式理解

    Android常用设计模式之Builder模式 1 单例模式 2 Builder模式 Builder模式的应用场景 总结 1 单例模式 单例模式之前有详细的介绍,可移步到链接: 常见的单例模式及其特点 ...

  3. Java设计模式之Builder模式

    Java设计模式之Builder模式 Java设计模式之Builder模式 简介 适用性 用LOL的出装备的顺序为例 基本实现代码 BasePerson的实现 DeMaXiYa的实现 QiTianDa ...

  4. 「设计模式(六) - Builder模式」

    「设计模式(六) - Builder模式」 一.可定制化的 电脑的组装在生活中并不陌生,大家都有电脑,当然需求不一样配置也不一样.以Macbook Pro为例,像UI设计对图像模块GPU要求比较高,跑 ...

  5. [Head First设计模式]山西面馆中的设计模式——装饰者模式

    原文:[Head First设计模式]山西面馆中的设计模式--装饰者模式 引言 在山西面馆吃鸡蛋面的时候突然想起装饰者这个模式,觉得面馆这个场景跟书中的星巴兹咖啡的场景很像,边吃边思考装饰者模式.这里 ...

  6. Java 设计模式之Builder模式

    设计模式系列 创建型设计模式 Java 设计模式之单例模式 Java 设计模式之静态工厂方法模式 Java 设计模式之工厂方法模式 Java 设计模式之抽象工厂模式 Java 设计模式之Builder ...

  7. 理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式丨C++后端开发丨Linux服务器开发丨web服务器

    理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式 1. 开闭.单一职责.里氏替换.接口隔离等设计原则 2. 随处可见的模板方法 3. nginx中核心设计模式 责任链模式 4. 责 ...

  8. Android常考问题(8)-设计模式:Builder模式(顺带学习了一下String的比较和final)

    今天的主要目的是学习设计模式中的Builder模式.由于java基础不牢固,在学习过程中要回过头去学习java内容,因此凑成了这样一篇驳杂的文章. Builder模式 首先是Builder设计模式的作 ...

  9. 【设计模式】Builder模式

    一.前言 设计模式系列(参考资料:<Android源码设计模式解析与实战>--何红辉.关爱明) 单例模式 Builder模式 原型模式 二.介绍 我们开发中偶尔会遇到一些需要设置10个或以 ...

  10. 码农小汪-设计模式之-Builder模式

    建造者模式 将一个复杂的对象的构建与它的表示分离,使得同样构建的过程中可以创建不同的表示.这个话语看起来,好累啊!真心很难理解. 下面是它的UML图: 抽象建造者角色(Builder):为创建一个Pr ...

最新文章

  1. TCP协议实现文件传输
  2. java implements t_Java泛型——為什么“擴展T”允許而不是“實現T”?
  3. Java并发包基石-AQS详解
  4. php文本框限制字节,js限制文本框输入长度两种限制方式(长度、字节数)_基础知识...
  5. 批量查进程linux,linux 批量删除进程与查看进程详解
  6. SQL Server-【知识与实战VIII】触发器(上)
  7. 拓端tecdat|R语言解决最优化问题-线性规划(LP)问题
  8. 踩坑事件:windows操作系统下的eclipse中编写SparkSQL不能从本地读取或者保存parquet文件
  9. iOS autoreleasePool 深入理解
  10. 阿里笔试题解(2020.4.17场)
  11. M1 芯片Macbook pro连接支持AirPrint的佳能打印机
  12. 等额本金等额本息推导
  13. kali linux安装微信,kali liunx2020.2最简单的安装微信,QQ等windows软件,同样适合,Debian Ubuntu...
  14. 【滤波跟踪】基于EKF、时差和频差定位实现目标跟踪附matlab代码
  15. 软件架构与设计(十)-----架构技术
  16. PL/SQL Developer中用dbms_output.put_line输出
  17. 干货丨李睿:新时代的医学影像及心脑血管成像的应用
  18. ESP8266-12F最小系统板程序烧录
  19. notepad++中文简体下载
  20. 在线体验 Windows 11「GitHub 热点速览 v.21.30」

热门文章

  1. 金山毒霸2012秒杀全新病毒
  2. LCD1602----LiquidCrystal库的使用2
  3. 红海竞争下,「社交+」在中东泛娱乐 App 市场的出海新机遇
  4. 潮流计算计算机算法研究现状,电力系统潮流计算研究现状
  5. Python实现PDF转TXT
  6. 迅雷精简版 for Mac(迅雷下载器)v4.1.2中文版
  7. 人工智能、机器学习、深度学习和神经网络的关系
  8. CEF加载PPAPI插件
  9. RestClient查询文档
  10. 新浪微博从 Kafka 到 Pulsar 的演变