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

Java 設計模式深度解析:原型模式

     編輯:Java 相關知識

什麼是原型模式?

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

核心角色與類圖

原型模式類圖

原型模式的核心在於 Prototype 抽象類(或介面),它定義了複製自己的方法。具體原型類 ConcretePrototype 實現這個方法。客戶端通過調用原型的 clone() 方法獲取新對象。

Java 實現的兩個關鍵條件

在 Java 中實現原型模式,類必須滿足:

  1. 實現 Cloneable 介面:這是一個標記介面,告知 JVM 該類支援 clone() 方法。若未實現,執行時會拋出 CloneNotSupportedException。
  2. 覆寫 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 快得多。
  • 簡化創建:如同文檔編輯中的「複製-貼上」,隱藏了複雜的構造細節。
  • 適用場景:循環中大量創建相似對象、對象初始化過程複雜、需動態增減產品類別時。

深拷貝 vs 淺拷貝(重點)

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 為深拷貝:Java 8 種基本型別及其包裝類、String 皆為值複製;其餘皆為淺拷貝。

總結

原型模式雖簡單,但實務中常與其他模式(如工廠、建造者)結合使用。掌握「淺/深拷貝」與「建構子繞過」兩大陷阱,才能安全落地。

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