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

C++ 設計模式:原型模式完整解析與 Clone 深淺拷貝實作細節

     編輯:關於C語言

原型模式以原型實例指定建立物件種類,並透過拷貝這些原型建立新物件。本文解析核心思想、四大適用場景、UML 結構、Clone 與拷貝建構函數關係、深/淺拷貝陷阱、與其他建構型模式對比。

核心概念

用原型實例指定建立物件的種類,並且通過拷貝這些原型建立新的物件。—— GoF

關鍵字:**拷貝**。如同老師印製一份習題原版,複印 50 份分發,而非逐人抄寫。

四大適用場景

  1. 物件類型在執行期才能確定,克隆現有實例比新建更簡便。
  2. 需要特定狀態下的物件副本(新建物件狀態不對,克隆可保留當下狀態)。
  3. 物件結構簡單、差異僅屬性少許,克隆省去繁瑣建構參數。
  4. 建構函數參數複雜且不完全理解,克隆繞過建構邏輯。

UML 類別圖

原型模式 UML

  • Prototype:宣告純虛擬 Clone()。
  • ConcretePrototype:實作 Clone() 內部呼叫拷貝建構函數 new ConcretePrototype(*this)。
  • 必須重寫拷貝建構函數以實現深拷貝(含指標/資源成員)。

C++ 基礎實作

#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;
}

深拷貝 vs 淺拷貝關鍵點

  • 若類別含指標/資源/容器成員,**預設拷貝建構為淺拷貝**(僅複製指標值),必須自訂拷貝建構函數執行深拷貝。
  • Clone() 內部呼叫拷貝建構,故拷貝建構正確 ⇔ Clone 正確。
  • 克隆後若需修改狀態,可增加 Initialize() 方法重置特定欄位。
  • 循環參考、不可拷貝成員(mutex、unique_ptr)會導致 Clone 難以實作,需特別處理。

與其他建構型模式對比

模式核心意圖典型場景
工廠方法單一工廠生產單一產品建構邏輯固定、單一產品族
抽象工廠單一工廠生產多個相依產品產品族內部有相依/約束
建造者分步驟建構複雜物件,控制細節建構過程複雜、需精細控制
原型自我拷貝建立相同物件執行期決定類型、需特定狀態副本

缺點與限制

  1. 每個子類別必須實作 Clone(),既有類別難以追加(侵入性)。
  2. 含循環參考/不可拷貝資源時實作困難。
  3. 淺/深拷貝邏輯易出錯,需嚴格測試。

總結

原型模式以「自我拷貝」獨特方式解決物件建構問題,在狀態保留、執行期類型決定、簡化建構參數場景極具優勢。掌握 Clone() 與拷貝建構函數的深拷貝實作細節,是正確應用的關鍵。

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