一、概念
一个对象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()方法即组装方法。
任重而道远
网友评论