当前位置:   article > 正文

原型模式(Prototype Pattern) C++

原型模式(Prototype Pattern) C++

上一节:建造者模式(Builder Pattern)C++

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

步骤 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;
    }
};

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

步骤 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

原型模式可以在不知道对象具体类型的情况下克隆对象,并减少子类的构造。也可以可以避免构造函数的约束,因为对象的复制通常是通过某种复制方法实现的。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/137716
推荐阅读
相关标签
  

闽ICP备14008679号