上一節:建造者模式(Builder Pattern)C++
文章目錄
- 0.理論
- 1.原型模式的核心組成:
- 2.實現方法
- 3.什么時候使用
- 1.實踐
- 步驟 1: 定義怪物原型
- 步驟 2: 實現具體怪物原型
- 步驟 3: 使用原型創建怪物
0.理論
原型模式(Prototype Pattern)是一種創建型設計模式,其思想是基于一個原型實例創建對象的副本,從而避免新實例創建時的標準方式(如使用new關鍵字)。在需要創建的對象與原有對象類似或者創建過程較為復雜時,使用原型模式可以更高效地復制對象。
1.原型模式的核心組成:
- 原型(Prototype):一個接口或抽象類,定義了復制(克隆)自身的方法。
- 具體原型(Concrete Prototype):實現原型接口的類的實例,這個實現包括如何克隆自身的具體操作。
- 客戶(Client):使用原型實例創建新對象的類。
2.實現方法
- 淺克隆(Shallow Clone):復制對象時僅復制對象本身和對象中的原始類型的字段值,而不復制對象引用指向的對象。淺克隆可以快速復制,但不包括對象內部的引用對象。
- 深克隆(Deep Clone):復制對象時,除了對象本身和原始類型的字段值外,還遞歸地復制對象中的所有引用對象。深克隆使得副本與原始對象在結構上完全獨立,修改副本不會影響原始對象。
3.什么時候使用
- 當直接創建一個對象的成本較高或復雜時,使用原型模式可以簡化對象的創建過程。
- 當需要重復地創建相似對象時,可以利用已有對象進行克隆,減少創建對象的開銷。
- 當需要實現對象的撤銷和恢復功能時,通過保存對象的克隆副本來實現。
1.實踐
假設我們正在開發一個游戲,其中包含大量的怪物。這些怪物分為幾種類型,比如“地精”、“龍”等。每種怪物都有自己的屬性(如生命值、攻擊力等),但同種類型的怪物在初始狀態下這些屬性是相同的。在游戲中,我們需要頻繁地創建同類型的怪物實例。為了提高性能和簡化創建過程,我們可以使用原型模式來實現怪物的創建。
步驟 1: 定義怪物原型
首先,定義一個怪物原型基類,其中包含一個虛擬的克隆方法:
#include <iostream>// 怪物原型基類
class Monster {
public:virtual ~Monster() {}virtual Monster* clone() const = 0;virtual void attack() const = 0;
};
步驟 2: 實現具體怪物原型
然后,為每種怪物類型實現具體的原型類:
// 地精怪物
class Goblin : public Monster {
public:Goblin* clone() const override {return new Goblin(*this);}void attack() const override {std::cout << "Goblin attacks! Damage: 10" << std::endl;}
};// 龍怪物
class Dragon : public Monster {
public:Dragon* clone() const override {return new Dragon(*this);}void attack() const override {std::cout << "Dragon breathes fire! Damage: 100" << std::endl;}
};
步驟 3: 使用原型創建怪物
最后,在游戲邏輯中,我們可以通過克隆原型來創建新的怪物實例:
int main() {// 創建原型Goblin* goblinPrototype = new Goblin();Dragon* dragonPrototype = new Dragon();// 克隆新怪物Monster* goblin1 = goblinPrototype->clone();Monster* dragon1 = dragonPrototype->clone();// 使用怪物實例進行攻擊演示goblin1->attack();dragon1->attack();// 清理資源delete goblinPrototype;delete dragonPrototype;delete goblin1;delete dragon1;return 0;
}
原型模式可以在不知道對象具體類型的情況下克隆對象,并減少子類的構造。也可以可以避免構造函數的約束,因為對象的復制通常是通過某種復制方法實現的。