上一节:建造者模式(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;
}
原型模式可以在不知道对象具体类型的情况下克隆对象,并减少子类的构造。也可以可以避免构造函数的约束,因为对象的复制通常是通过某种复制方法实现的。