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

設計模式實作系列(四):Prototype 原型模式 - 以複製原型建立新物件實現虛擬建構子

     編輯:關於C++

模式意圖

用原型實例指定建立物件的種類,並且透過複製這些原型建立新的物件。

UML 結構圖

Prototype Pattern UML

核心解析:虛擬建構子

C++ 無原生虛擬建構子,但透過 Clone() 虛擬函數達到同等效果:

  • Prototype: 抽象基類宣告純虛擬 Clone()。
  • ConcretePrototype: 實作 Clone() 回傳 new ConcretePrototype(*this)(複製建構子)。
  • 客戶端: 僅持有 Prototype*,呼叫 Clone() 獲取新物件,不知具體型別。

C++ 完整實作

1. Prototype.h

#ifndef PROTOTYPE_H
#define PROTOTYPE_H

class Prototype {
public:
    Prototype() {}
    virtual ~Prototype() {}
    virtual Prototype* Clone() = 0;
};

class ConcretePrototype1 : public Prototype {
public:
    ConcretePrototype1();
    ConcretePrototype1(const ConcretePrototype1&);
    virtual ~ConcretePrototype1();
    virtual Prototype* Clone();
};

class ConcretePrototype2 : public Prototype {
public:
    ConcretePrototype2();
    ConcretePrototype2(const ConcretePrototype2&);
    virtual ~ConcretePrototype2();
    virtual Prototype* Clone();
};

#endif

2. Prototype.cpp

#include "Prototype.h"
#include <iostream>

ConcretePrototype1::ConcretePrototype1() { std::cout << "construction of ConcretePrototype1\n"; }
ConcretePrototype1::~ConcretePrototype1() { std::cout << "destruction of ConcretePrototype1\n"; }
ConcretePrototype1::ConcretePrototype1(const ConcretePrototype1&) { std::cout << "copy construction of ConcretePrototype1\n"; }
Prototype* ConcretePrototype1::Clone() { return new ConcretePrototype1(*this); }

ConcretePrototype2::ConcretePrototype2() { std::cout << "construction of ConcretePrototype2\n"; }
ConcretePrototype2::~ConcretePrototype2() { std::cout << "destruction of ConcretePrototype2\n"; }
ConcretePrototype2::ConcretePrototype2(const ConcretePrototype2&) { std::cout << "copy construction of ConcretePrototype2\n"; }
Prototype* ConcretePrototype2::Clone() { return new ConcretePrototype2(*this); }

3. Main.cpp

#include "Prototype.h"
#include <cstdlib>

int main() {
    Prototype* p1 = new ConcretePrototype1();
    Prototype* p2 = p1->Clone(); // 複製 p1

    Prototype* p3 = new ConcretePrototype2();
    Prototype* p4 = p3->Clone(); // 複製 p3

    delete p1; delete p2; delete p3; delete p4;
    return 0;
}

淺層 vs 深層複製

  • 淺層複製: 預設複製建構子逐位元複製指標,導致多物件共用同一塊動態記憶體(雙重釋放風險)。
  • 深層複製: 在複製建構子中為指標成員分配新記憶體並複製內容。實作 Clone 時必須確保深層複製邏輯正確。

現代 C++ 與實務

  • 回傳 std::unique_ptr<Prototype> 明確擁有權移轉。
  • 結合 Factory:PrototypeFactory 管理原型註冊表(map<string, Prototype*>),Create(type) 呼叫 Clone()。
  • 序列化/反序列化可視為跨進程的 Prototype 應用。

適用場景

  • 物件建構昂貴(如解析大型 XML、載入資源),複製成本遠低於新建。
  • 系統需獨立於產品建立、組合、表示方式。
  • 動態載入模組、外掛系統依類別名稱實例化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved