建造者设计模式

2019-08-08  本文已影响0人  gczxbb

一、概念

一个对象A内部依赖的对象比较多,依赖a1,a2,a3..,每个ax对象都很复杂,A类可以用建造者设计模式创建A对象。
比如,将A类当成一个房子,它依赖关联的内容当成房子建造的必要材料,砖头,木材,钢筋。创建A对象时,由各类材料对象build()组合成一个对象,这样的设计模式(架构)可以理解成房子搭建图纸。

Retrofit retrofit = new Retrofit.Builder().baseUrl(HostIp)
              .addConverterFactory(GsonConverterFactory.create())
              .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
              .client(okHttpClient)
              .build();

创建一个Retrofit对象,内部依赖,包括HttpUrl,转换器,适配器,工厂。普通情况,创建Retrofit对象,将每个依赖对象创建,set到内部,一个框架,依赖对象最好的情况是可配置,外部可自定义对象或不自定义即默认对象。

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

静态内部类Builder,创建一个Builder对象,用户可以自定义Retrofit的依赖对象。在最终build()方法,根据配置依赖对象,以及兜底默认对象,组装成Retrofit。

public Builder client(OkHttpClient client) {
    return callFactory(checkNotNull(client, "client == null"));
}

public Builder callFactory(okhttp3.Call.Factory factory) {
    this.callFactory = checkNotNull(factory, "factory == null");
    return this;
}

public Builder baseUrl(String baseUrl) {
    checkNotNull(baseUrl, "baseUrl == null");
    HttpUrl httpUrl = HttpUrl.parse(baseUrl);
    if (httpUrl == null) {
        throw new IllegalArgumentException("Illegal URL: " + baseUrl);
    }
    return baseUrl(httpUrl);
}

Build类的方法,将外部设置的Retrofit依赖对象,保存到自己内部,每个方法都返回Build对象,链式调用。

public Retrofit build() {
    if (baseUrl == null) {
        throw new IllegalStateException("Base URL required.");
    }

    okhttp3.Call.Factory callFactory = this.callFactory;
    if (callFactory == null) {
        callFactory = new OkHttpClient();
    }

    Executor callbackExecutor = this.callbackExecutor;
    if (callbackExecutor == null) {
        callbackExecutor = platform.defaultCallbackExecutor();
    }

    List<CallAdapter.Factory> adapterFactories = new ArrayList<>(this.adapterFactories);
    adapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));

    List<Converter.Factory> converterFactories = new ArrayList<>(this.converterFactories);

    return new Retrofit(callFactory, baseUrl, converterFactories, adapterFactories,
            callbackExecutor, validateEagerly);
}

build()方法,创建Retrofit对象,将Builder内部对象传递Retrofit依赖,外部未设置的对象,初始化默认值。

二、总结

优势:基于建造者模式设计的类创建一个对象时,可以在外部动态配置对象的内部依赖,简化创建方式,由零部件组装成一个整体对象的过程,内部Builder类是负责零件组装生产对象的类,build()方法即组装方法。


任重而道远

上一篇 下一篇

猜你喜欢

热点阅读