原型模式 屬於創建型模式。通過一個原型對象指定創建對象的類型,然後通過拷貝原型對象創建更多同類型對象。Java 中所有類繼承 Object,利用 clone() 實現拷貝。
x.clone() != x — 拷貝對象非原對象。x.clone().getClass() == x.getClass() — 類型相同。equals() 定義恰當,x.clone().equals(x) 應為 true。角色:客戶端、抽象原型、具體原型。
// 抽象原型
public interface Prototype extends Cloneable {
Object clone() throws CloneNotSupportedException;
}
// 具體原型
public class ConcretePrototype implements Prototype {
public Object clone() throws CloneNotSupportedException {
try {
return super.clone();
} catch (Exception e) {
return null;
}
}
}
// 客戶端
public class Client {
public void operation(Prototype example) throws CloneNotSupportedException {
Prototype p = (Prototype) example.clone();
}
}
適用於原型對象少且固定的場景。
增加 原型管理器 角色,負責創建、登記、管理原型對象。
// 原型管理器
public class PrototypeManager {
private Vector prototypes = new Vector<>();
public void add(Prototype p) { prototypes.add(p); }
public Prototype get(int i) { return prototypes.get(i); }
}
// 客戶端
public class Client {
private PrototypeManager pm = new PrototypeManager();
public void registerPrototype(Prototype prototype) throws CloneNotSupportedException {
Prototype clone = (Prototype) prototype.clone();
pm.add(clone);
}
}
適用於原型對象不固定、需動態增減的場景。
| 類型 | 行為 | 適用場景 |
|---|---|---|
| 淺拷貝 | 基本類型複製值,引用類型複製引用地址(共用同一對象) | 對象無引用類型字段,或引用對象不可變 |
| 深拷貝 | 基本類型複製值,引用類型遞歸拷貝對象(完全獨立) | 對象包含可變引用類型字段,需完全隔離 |
每個類都需實現拷貝方法;含間接引用對象時需處理 transient 或手動深拷貝。