写在前面
一直不喜欢复杂繁琐的东西,建造者模式就是一个很繁琐的模式,要写一堆代码。更不喜欢那些经验很丰富的人跟我说:这个模式好,你要用起来。但是他们自己说不出哪里好。
使用建造者模式的样子
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
其实只是用了builder里面的成员变量。使用如下:
val client = OkHttpClient.Builder()
.readTimeout(Duration.ofSeconds(20))
.writeTimeout(Duration.ofSeconds(20))
.build()
不用构造者模式的样子
class OkHttpClient(
val readTimeoutMillis: Int = 10000,
val writeTimeoutMillis: Int = 10000,
)
直接把Builder
里面的参数写成OkHttpClient
的参数,这不是更加简单么,效果不是一样的吗?使用如下:
val client = OkHttpClient(
readTimeoutMillis = 20000,
writeTimeoutMillis = 20000,
)
为什么要用建造者模式?不懂。
网友评论