Retrofit通过建造者模式进行创建
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.build();
build方法主要进行了初始化赋值
public Retrofit build() {
//...
okhttp3.Call.Factory callFactory = this.callFactory;
//如果callFactory为null,则赋值为OkHttpClient
if (callFactory == null) {
callFactory = new OkHttpClient();
}
Executor callbackExecutor = this.callbackExecutor;
//如果callbackExecutor为null,赋值为相应平台默认的Excutor,用作回调回UI线程
if (callbackExecutor == null) {
callbackExecutor = platform.defaultCallbackExecutor();
}
//将Call对象转化的合适执行类的List,比如RxJavaCallAdapterFactory
List<CallAdapter.Factory> adapterFactories = new ArrayList<>(this.adapterFactories);
//根据不同平台 添加默认CallAdapterFactory
adapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));
//转化数据对象的List,比如GsonConverterFactory
List<Converter.Factory> converterFactories = new ArrayList<>(this.converterFactories);
//传入参数,创建Retroft对象
return new Retrofit(callFactory, baseUrl, converterFactories, adapterFactories,
callbackExecutor, validateEagerly);
}
其中,这里的platform对象在Builder对象构造方法中初始化
public Builder() {
this(Platform.get());
}
来看Platform.get()
,get方法想到于是一个工厂模式,而Platform显然是策略模式,根据不同的平台,执行不同的操作。
class Platform {
private static final Platform PLATFORM = findPlatform();
static Platform get() {
return PLATFORM;
}
private static Platform findPlatform() {
try {
Class.forName("android.os.Build");
//如果是Android平台
if (Build.VERSION.SDK_INT != 0) {
return new Android();
}
} catch (ClassNotFoundException ignored) {
}
try {
//如果是Java平台
Class.forName("java.util.Optional");
return new Java8();
} catch (ClassNotFoundException ignored) {
}
try {
//如果是IOS平台
Class.forName("org.robovm.apple.foundation.NSObject");
return new IOS();
} catch (ClassNotFoundException ignored) {
}
return new Platform();
}
}