Builder Pattern
Factory Pattern 是為了生成不同類型的產品
Builder Pattern 是為了生成相同的產品但內容的屬性不同
要解決的問題
- 太冗長且不易閱讀的建構子
- 建構子內不需要的參數可以給予 null 而不用強硬給 default Value
- 生產的物件在不同情境下有不同的屬性
- 物件的建構會被反覆呼叫與使用
需要遵守的規則
- 隱藏建構子
- 使用一個 inner class Builder 替代建構子來生成物件
- 向外暴露 setting fun 去改變物件的屬性
- 最後暴露一個 fun build 回傳當前設計好的物件
Example
用電腦來作為例子,要生成一個電腦的物件,需要一些零件,這邊也就透過 Builder 的內部 fun 去讓外部呼叫且彈性的設置。最終透過呼叫 build 回傳我們要的 Computer 物件
class Computer private constructor(
val cpu: String?,
val window: String?,
val id: Int?
) {
data class Builder(
private var cpu: String? = null,
private var window: String? = null,
private var id: Int? = null
) {
fun setCPU(cpu: String) = apply { this.cpu = cpu }
fun setWindow(window: String) = apply { this.window = window }
fun setID(id: Int) = apply { this.id = id }
fun build() = Computer(cpu, window, id)
}
}
fun main() {
val computer = Computer.Builder()
.setCPU("intel i7")
.setWindow("18吋")
.setID(10)
.build()
println(computer.cpu)
println(computer.window)
println(computer.id)
}
Ref: Builder (refactoring.guru)