Builder Pattern(构建者模式)

2020-09-13  本文已影响0人  一个追寻者的故事

介绍

Builder模式是一步一步创建一个复杂对象的创建型模式。它允许用户在不知道内部构建细节的情况下,可以更精准的控制对象的构造流程。该模式是为了将构建复杂对象的过程 和 它的部件解耦,使得构建过程和部件的表示隔离开来。

定义

将一个复杂对象的构建和它的表示分离。使得同样的构建过程可以创建不同的表示。

使用场景

当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时。

应用

说起 Builder模式,最先想起来的就是 okhttp,很多重要的对象都是 支持通过Builder模式创建的。如:OkHttpClientRequest

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()

上一篇 下一篇

猜你喜欢

热点阅读