Retrofit的設(shè)計(jì)模式 -- Builder模式

Retrofit中的Builder模式

1、Retrofit的構(gòu)造

public final class Retrofit {
  private final Map<Method, ServiceMethod> serviceMethodCache = new LinkedHashMap<>();

  private final okhttp3.Call.Factory callFactory;
  private final HttpUrl baseUrl;
  private final List<Converter.Factory> converterFactories;
  private final List<CallAdapter.Factory> adapterFactories;
  private final Executor callbackExecutor;
  private final boolean validateEagerly;

  Retrofit(okhttp3.Call.Factory callFactory, HttpUrl baseUrl,
      List<Converter.Factory> converterFactories, List<CallAdapter.Factory> adapterFactories,
      Executor callbackExecutor, boolean validateEagerly) {
    this.callFactory = callFactory;
    this.baseUrl = baseUrl;
    this.converterFactories = unmodifiableList(converterFactories); // Defensive copy at call site.
    this.adapterFactories = unmodifiableList(adapterFactories); // Defensive copy at call site.
    this.callbackExecutor = callbackExecutor;
    this.validateEagerly = validateEagerly;
  }
.......
public static final class Builder {
    private Platform platform;
    private okhttp3.Call.Factory callFactory;
    private HttpUrl baseUrl;
    private List<Converter.Factory> converterFactories = new ArrayList<>();
    private List<CallAdapter.Factory> adapterFactories = new ArrayList<>();
    private Executor callbackExecutor;
    private boolean validateEagerly;

    Builder(Platform platform) {
      this.platform = platform;
      // Add the built-in converter factory first. This prevents overriding its behavior but also
      // ensures correct behavior when using converters that consume all types.
      converterFactories.add(new BuiltInConverters());
    }

    public Builder() {
      this(Platform.get());
    }
    ......
public Retrofit build() {
      ......
      return new Retrofit(callFactory, baseUrl, converterFactories, adapterFactories,
          callbackExecutor, validateEagerly);
    }

以上是Retrofit的構(gòu)造過程(其實(shí)在Builder構(gòu)造中也用到了簡(jiǎn)單工廠模式)。
2、Builder模式的特點(diǎn)
當(dāng)一個(gè)類有大量屬性需要初始化的時(shí)候,為了避免對(duì)外的API接口繁多和屬性建立的先后順序混亂,這個(gè)時(shí)候可以使用Builder模式來設(shè)置類的屬性,這樣可以把屬性和屬性的構(gòu)造過程完全分離,耦合性降低并且可擴(kuò)展性增加。
其實(shí)Retrofit中用了大量的Builder模式,再比如
ServiceMethod的構(gòu)造
其實(shí)特點(diǎn)很好總結(jié):

  1. 外部類有個(gè)包含Builder參數(shù)的構(gòu)造函數(shù)
  2. 在構(gòu)造函數(shù)中把Builder中各個(gè)屬性的值賦給外部類中的對(duì)應(yīng)的屬性值
  3. 在Builder類中有一個(gè)builder方法,此方法返回值為外部類
  4. 為了客戶端鏈?zhǔn)秸{(diào)用設(shè)置Builder屬性值,把Builder中的方法返回值都設(shè)置為Builder(builder方法除外)

3、Builder模式的使用
在項(xiàng)目中用Builder模式封裝了WebView,因?yàn)閃ebView有大量的屬性需要構(gòu)造,把Builder模式用在這里是在合適不過了,Builder模式的運(yùn)用-WebView的構(gòu)造。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,039評(píng)論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,562評(píng)論 19 139
  • Retrofit是squareup公司的開源力作,和同屬squareup公司開源的OkHttp,一個(gè)負(fù)責(zé)網(wǎng)絡(luò)調(diào)度,...
    藍(lán)灰_q閱讀 42,118評(píng)論 23 281
  • 引言 在上一篇Builder模式演義(1)中介紹了Builder模式的標(biāo)準(zhǔn)形式,以及兩種基本變換——鏈?zhǔn)秸{(diào)用和省略...
    臍橙熟了閱讀 1,548評(píng)論 2 13
  • 監(jiān)控工具 你可以用下面的這些工具來監(jiān)控 JVM 性能統(tǒng)計(jì)信息。本文所描述的工具正在試驗(yàn)階段,不推薦大家使用,使用前...
    翼徳閱讀 214評(píng)論 0 0

友情鏈接更多精彩內(nèi)容