原型 (Prototype)

★★★★★Studied

FromDesign Patterns (GoF)大話設計模式

📚 From the Books

原型 (Prototype)ConceptCreational

用「複製一個既有物件」來產生新物件,取代從零 new;新物件以原型為範本,呼叫端不必知道它的具體類別,也省去昂貴的重新初始化。

🧠 When to Use

TIP

訊號:建立一個物件很貴(要查 DB、讀檔、複雜計算),但你手上已經有一個「長得差不多」的實例,複製它再微調,比重新組裝快得多。

⚖️ Structure & Variants

經典版 — clone() 自我複製
interface Shape { fun clone(): Shape }

data class Circle(var x: Int, var y: Int, val style: Style) : Shape {
    override fun clone() = copy(style = style.copy())   // 連同可變的 style 一起複製
}

val original = Circle(0, 0, Style(color = "red"))
val pasted = original.clone().also { it.x = 100 }       // 以原型為範本,再微調
  • 複製邏輯封裝在物件自己身上;呼叫端只認 Shape 介面,不碰具體型別。
深拷貝 vs 淺拷貝陷阱
  • 淺拷貝:只複製欄位的引用,巢狀的可變物件仍共用同一份——改 copy 會連帶改到 original。
  • 深拷貝:連同內部物件遞迴複製,彼此獨立,但成本高、遇到循環引用要小心。
  • Kotlin 的 data class.copy()淺拷貝:可變的巢狀欄位要自己再 copy()(如上例的 style)。
與 Builder / Factory Method 的差別
  • Prototype:不從零組,複製既有物件當起點。
  • Builder:一步步組裝全新物件。
  • Factory Method:靠子類別決定 new 哪個型別;prototype 則用實例本身決定。

⚠️ Misuse & Anti-patterns

🔑 Takeaways

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading