原型模式(Prototype Pattern) C++

本文介绍了原型模式的基本原理、核心组成以及实现方法,通过在游戏开发中创建怪物实例的示例,展示了如何利用原型模式提高性能和简化对象创建。
摘要由CSDN通过智能技术生成

上一节:建造者模式(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;
};

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

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

下一节:适配器模式(Adapter Pattern) C++

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值