原型模式屬於創建型設計模式,其核心思想是:用原型實例指定創建對象的種類,並通過拷貝這些原型創建新的對象。簡單來說,就是「複製」現有對象來生成新對象,而非通過 new 關鍵字從頭構建。

原型模式的核心在於 Prototype 抽象類(或介面),它定義了複製自己的方法。具體原型類 ConcretePrototype 實現這個方法。客戶端通過調用原型的 clone() 方法獲取新對象。
在 Java 中實現原型模式,類必須滿足:
Cloneable 介面:這是一個標記介面,告知 JVM 該類支援 clone() 方法。若未實現,執行時會拋出 CloneNotSupportedException。Object.clone() 並設為 public:Object 的 clone() 是 protected,外部無法直接調用,必須公開並處理異常。class Prototype implements Cloneable {
public Prototype clone() {
Prototype prototype = null;
try {
prototype = (Prototype) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return prototype;
}
}
class ConcretePrototype extends Prototype {
public void show() {
System.out.println("原型模式實現類");
}
}
public class Client {
public static void main(String[] args) {
ConcretePrototype cp = new ConcretePrototype();
for (int i = 0; i < 10; i++) {
ConcretePrototype clonecp = (ConcretePrototype) cp.clone();
clonecp.show();
}
}
}
clone() 是本地方法,直接操作記憶體二進制流,複製大對象時比 new 快得多。Object.clone() 預設為淺拷貝:基本類型與 String 複製值,但引用類型(陣列、集合、物件)僅複製引用地址。修改副本的引用型欄位會影響原對象。
深拷貝實現範例:
public class Prototype implements Cloneable {
private ArrayList list = new ArrayList();
public Prototype clone() {
Prototype prototype = null;
try {
prototype = (Prototype) super.clone();
prototype.list = (ArrayList) this.list.clone(); // 手動深拷貝集合
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return prototype;
}
}
幸運的是,Java 集合框架(ArrayList、HashMap 等)多實現了 Cloneable,深拷貝相對容易。
clone() 直接在記憶體複製數據,建構子邏輯不執行,甚至繞過 private 建構子。這導致單例模式與原型模式衝突,使用時務必小心。String 皆為值複製;其餘皆為淺拷貝。原型模式雖簡單,但實務中常與其他模式(如工廠、建造者)結合使用。掌握「淺/深拷貝」與「建構子繞過」兩大陷阱,才能安全落地。