kotlin中Builder模式在一些復雜實體類構建,或者封裝的統一多樣化控件中使用方便。
示例一:實體對象的構建
/**
* 類型安全的構造器
*/
class Car(
val model: String? ,
val year: Int
){
companion object {
/**
* 帶接收者的函數類型,這意味著我們需要向函數傳遞一個Builder類型的實例
*/
inline fun build(block: Builder.() -> Unit) = Builder().apply(block).build()
}
class Builder{
var model: String? = null
var year: Int = -1
fun build() = Car(model ,year)
}
}
使用
val car = Car.build {
model = "名字"
year = 2017
}
示例二:通用多樣化控件的構建
class Dialog private constructor(
val title: String,
val text: String?,
val onAccept: (() -> Unit)?
) {
class Builder(val title: String) {
var text: String? = null
var onAccept: (() -> Unit)? = null
fun setText(text: String?): Builder {
this.text = text
return this
}
fun setOnAccept(onAccept: (() -> Unit)?): Builder {
this.onAccept = onAccept
return this
}
fun build() = Dialog(title, text, onAccept)
}
}
使用
val dialog1 =Dialog.Builder("Some title")
.setText("Great dialog")
.setOnAccept { Log.i("tag" ,"I was clicked") }
.build()
val dialog2 = Dialog.Builder("Another dialog")
.setText("I have no buttons")
.build()
val dialog3 = Dialog.Builder("Dialog with just a title").build()