原型模式以原型實例指定建立物件種類,並透過拷貝這些原型建立新物件。本文解析核心思想、四大適用場景、UML 結構、Clone 與拷貝建構函數關係、深/淺拷貝陷阱、與其他建構型模式對比。
用原型實例指定建立物件的種類,並且通過拷貝這些原型建立新的物件。—— GoF
關鍵字:**拷貝**。如同老師印製一份習題原版,複印 50 份分發,而非逐人抄寫。

Prototype:宣告純虛擬 Clone()。 ConcretePrototype:實作 Clone() 內部呼叫拷貝建構函數 new ConcretePrototype(*this)。#include <iostream>
using namespace std;
class Prototype {
public:
virtual ~Prototype() {}
virtual Prototype* Clone() = 0;
};
class ConcretePrototype : public Prototype {
int m_counter;
public:
ConcretePrototype() : m_counter(0) {}
// 拷貝建構函數:深拷貝邏輯
ConcretePrototype(const ConcretePrototype& rhs) : m_counter(rhs.m_counter) {}
ConcretePrototype* Clone() override {
return new ConcretePrototype(*this); // 呼叫拷貝建構
}
};
int main() {
ConcretePrototype *a = new ConcretePrototype();
ConcretePrototype *b = a->Clone(); // 獲得副本
delete a; delete b;
}
Clone() 內部呼叫拷貝建構,故拷貝建構正確 ⇔ Clone 正確。Initialize() 方法重置特定欄位。mutex、unique_ptr)會導致 Clone 難以實作,需特別處理。| 模式 | 核心意圖 | 典型場景 |
|---|---|---|
| 工廠方法 | 單一工廠生產單一產品 | 建構邏輯固定、單一產品族 |
| 抽象工廠 | 單一工廠生產多個相依產品 | 產品族內部有相依/約束 |
| 建造者 | 分步驟建構複雜物件,控制細節 | 建構過程複雜、需精細控制 |
| 原型 | 自我拷貝建立相同物件 | 執行期決定類型、需特定狀態副本 |
Clone(),既有類別難以追加(侵入性)。原型模式以「自我拷貝」獨特方式解決物件建構問題,在狀態保留、執行期類型決定、簡化建構參數場景極具優勢。掌握 Clone() 與拷貝建構函數的深拷貝實作細節,是正確應用的關鍵。