🎯 什麼情境該想到我
當「從頭建一個新物件」很花成本或很麻煩,你其實已經有一個現成的樣本、想直接照著它「複製一份」再改一改;或程式要到執行期才知道該生哪種物件、你不想為此堆一大票子類時。
⚙️ 怎麼用(步驟 / 公式)
- 意圖:用「複製一個既有實例(原型)」來建立新物件,而不是用
new從頭建。 - 主要參與者:
Prototype(宣告clone()的介面)、ConcretePrototype(實作 clone、自我複製)、Client(拿著一個原型物件,需要新物件時呼叫它的 clone)。 - 做法:在
Prototype介面宣告clone(),由各ConcretePrototype自己複製自己回傳新實例;Client 只要持有原型、對它clone()即可拿到新物件,不需知道具體類別。 - 關鍵決定深淺複製:淺複製只複製參照、共用內部物件;深複製連內部物件一起複製。依需求選對,避免新舊物件意外共用狀態。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 物件內含循環參照或深層巢狀結構時,
clone()(尤其深複製)的實作很麻煩、容易出錯。 - 該用深複製卻用了淺複製 → 新舊物件共用內部狀態,改一個動到另一個,是常見隱性 bug。
- 物件本來就很好建、成本又低時,複製沒有明顯好處。