介紹
當需要一個物件的複本,可先創建出一個新的該類別物件,再將其成員設為欲複製物件的內容。但有時重新創建物件所需的成本太高,像是物件成員值需透過耗時的操作取得(如:讀取IO、資料庫存取、網路互動等),此時可考慮使用 原型模式 將目標物件直接複製一份出來。
C++範例
#include <iostream>
// 提供一個含有 複製物件函式 的介面
class Prototype
{
public:
// 複製物件函式
virtual Prototype* Clone() = 0;
virtual ~Prototype() {}
virtual void PrintStatus() const = 0;
};
// 將欲複製的物件類別繼承上述介面,並實作複製物件函式
class Monster : public Prototype
{
public:
Monster(int hp, int armor) : m_HealthPoints(hp), m_ArmorPoints(armor)
{
}
// 拷貝構造函式
Monster(const Monster& obj)
{
// 這裡實作物件複製的細節
m_HealthPoints = obj.m_HealthPoints;
m_ArmorPoints = obj.m_ArmorPoints;
}
void PrintStatus() const override
{
std::cout << "HP: " << m_HealthPoints << std::endl;
std::cout << "Armor: " << m_ArmorPoints << std::endl;
}
Prototype* Clone() override
{
// 使用拷貝構造函式來複製物件內容
return new Monster(*this);
}
private:
int m_HealthPoints;
int m_ArmorPoints;
};
// 使用方法
int main()
{
// 創建一個Monster物件
Prototype* monster = new Monster(100, 50);
// 取得Monster物件的複本
Prototype* anotherMonster = monster->Clone();
// 顯示複本Monster物件的生命及裝甲值
anotherMonster->PrintStatus();
delete anotherMonster;
delete monster;
return 0;
}
Output:
HP: 100
Armor: 50