寫在前面
一直不喜歡復(fù)雜繁瑣的東西,建造者模式就是一個很繁瑣的模式,要寫一堆代碼负蠕。更不喜歡那些經(jīng)驗(yàn)很豐富的人跟我說:這個模式好,你要用起來倦畅。但是他們自己說不出哪里好遮糖。
使用建造者模式的樣子
OkHttp里面用了超級多的建造者模式,這里摘取了一小段叠赐,刪除了大部分欲账,只留我需要用來說明問題的那一部分。
class OkHttpClient(
builder: Builder
) {
val readTimeoutMillis: Int = builder.readTimeout
val writeTimeoutMillis: Int = builder.writeTimeout
class Builder constructor() {
internal var readTimeout = 10_000
internal var writeTimeout = 10_000
fun readTimeout(duration: Duration) = apply {
readTimeout = checkDuration("timeout", duration.toMillis(), TimeUnit.MILLISECONDS)
}
fun writeTimeout(duration: Duration) = apply {
writeTimeout = checkDuration("timeout", duration.toMillis(), TimeUnit.MILLISECONDS)
}
fun build(): OkHttpClient = OkHttpClient(this)
}
}
這個OkHttpClient
類只有一個builder
真正的成員變量芭概,其它的比如readTimeoutMillis
其實(shí)只是用了builder里面的成員變量赛不。使用如下:
val client = OkHttpClient.Builder()
.readTimeout(Duration.ofSeconds(20))
.writeTimeout(Duration.ofSeconds(20))
.build()
不用構(gòu)造者模式的樣子
class OkHttpClient(
val readTimeoutMillis: Int = 10000,
val writeTimeoutMillis: Int = 10000,
)
直接把Builder
里面的參數(shù)寫成OkHttpClient
的參數(shù),這不是更加簡單么罢洲,效果不是一樣的嗎踢故?使用如下:
val client = OkHttpClient(
readTimeoutMillis = 20000,
writeTimeoutMillis = 20000,
)
為什么要用建造者模式?不懂。