Builder Pattern(构建者模式)
2020-09-13 本文已影响0人
一个追寻者的故事
介绍
Builder模式是一步一步创建一个复杂对象的创建型模式。它允许用户在不知道内部构建细节的情况下,可以更精准的控制对象的构造流程。该模式是为了将构建复杂对象的过程 和 它的部件解耦,使得构建过程和部件的表示隔离开来。
定义
将一个复杂对象的构建和它的表示分离。使得同样的构建过程可以创建不同的表示。
使用场景
当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时。
应用
说起 Builder模式,最先想起来的就是 okhttp,很多重要的对象都是 支持通过Builder模式创建的。如:OkHttpClient
、 Request
open class OkHttpClient internal constructor(
builder: Builder
) : Cloneable, Call.Factory, WebSocket.Factory {
constructor() : this(Builder())
...
class Builder constructor() {
internal var dispatcher: Dispatcher = Dispatcher()
internal var connectionPool: ConnectionPool = ConnectionPool()
internal val interceptors: MutableList<Interceptor> = mutableListOf()
internal val networkInterceptors: MutableList<Interceptor> = mutableListOf()
internal var eventListenerFactory: EventListener.Factory = EventListener.NONE.asFactory()
internal var retryOnConnectionFailure = true
internal var authenticator: Authenticator = Authenticator.NONE
internal var followRedirects = true
internal var followSslRedirects = true
internal var cookieJar: CookieJar = CookieJar.NO_COOKIES
internal var cache: Cache? = null
internal var dns: Dns = Dns.SYSTEM
internal var proxy: Proxy? = null
internal var proxySelector: ProxySelector? = null
internal var proxyAuthenticator: Authenticator = Authenticator.NONE
internal var socketFactory: SocketFactory = SocketFactory.getDefault()
internal var sslSocketFactoryOrNull: SSLSocketFactory? = null
internal var x509TrustManagerOrNull: X509TrustManager? = null
internal var connectionSpecs: List<ConnectionSpec> = DEFAULT_CONNECTION_SPECS
internal var protocols: List<Protocol> = DEFAULT_PROTOCOLS
internal var hostnameVerifier: HostnameVerifier = OkHostnameVerifier
internal var certificatePinner: CertificatePinner = CertificatePinner.DEFAULT
internal var certificateChainCleaner: CertificateChainCleaner? = null
internal var callTimeout = 0
internal var connectTimeout = 10_000
internal var readTimeout = 10_000
internal var writeTimeout = 10_000
internal var pingInterval = 0
internal var minWebSocketMessageToCompress = RealWebSocket.DEFAULT_MINIMUM_DEFLATE_SIZE
internal var routeDatabase: RouteDatabase? = null
}
...
fun build(): OkHttpClient = OkHttpClient(this)
}
OkHttpClient
类的属性有30多个,在创建OkHttpClient
的时候,可以使用默认Builder中所有的属性,也可以根据需求修改特定的构建参数,从而可以任意组合创建不同的对象状态的过程。
// 第一种
val client = OkHttpClient()
// 第二种
val client1 = OkHttpClient.Builder()
.addInterceptor(LoggingInterceptor())
.build()
// 第三种
val client2 = OkHttpClient.Builder()
.addInterceptor(LoggingInterceptor())
.readTimeout(100, TimeUnit.MILLISECONDS)
.writeTimeout(100, TimeUnit.MILLISECONDS)
.connectTimeout(100, TimeUnit.MILLISECONDS)
.callTimeout(100, TimeUnit.MILLISECONDS)
.build()