Builder Pattern

Factory Pattern 是為了生成不同類型的產品

Builder Pattern 是為了生成相同的產品但內容的屬性不同

要解決的問題

  1. 太冗長且不易閱讀的建構子
  2. 建構子內不需要的參數可以給予 null 而不用強硬給 default Value
  3. 生產的物件在不同情境下有不同的屬性
  4. 物件的建構會被反覆呼叫與使用

需要遵守的規則

  1. 隱藏建構子
  2. 使用一個 inner class Builder 替代建構子來生成物件
  3. 向外暴露 setting fun 去改變物件的屬性
  4. 最後暴露一個 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)


Click here to share this article with your friends on X if you liked it.