首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 設計模式精講:原型模式與淺/深拷貝詳解

     編輯:Java 程式設計入門

模式定義

原型模式 屬於創建型模式。通過一個原型對象指定創建對象的類型,然後通過拷貝原型對象創建更多同類型對象。Java 中所有類繼承 Object,利用 clone() 實現拷貝。

clone() 契約

  1. x.clone() != x — 拷貝對象非原對象。
  2. x.clone().getClass() == x.getClass() — 類型相同。
  3. 若 equals() 定義恰當,x.clone().equals(x) 應為 true。

兩種實現形式

1. 簡單形式

角色:客戶端、抽象原型、具體原型。

// 抽象原型
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();
    }
}

適用於原型對象少且固定的場景。

2. 登記形式

增加 原型管理器 角色,負責創建、登記、管理原型對象。

// 原型管理器
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);
    }
}

適用於原型對象不固定、需動態增減的場景。

淺拷貝 vs 深拷貝

類型行為適用場景
淺拷貝基本類型複製值,引用類型複製引用地址(共用同一對象)對象無引用類型字段,或引用對象不可變
深拷貝基本類型複製值,引用類型遞歸拷貝對象(完全獨立)對象包含可變引用類型字段,需完全隔離

優缺點總結

優點

  1. 動態增減產品類,無需修改結構。
  2. 簡化創建結構,無需與產品類平行的工廠結構。
  3. 支持運行時動態加載新功能。
  4. 不依賴固定等級結構,適用性廣。

缺點

每個類都需實現拷貝方法;含間接引用對象時需處理 transient 或手動深拷貝。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved