原型模式

原型模式是一种设计模式,用于简化复杂对象的创建过程。它通过克隆已有对象来生成新的实例,解决了频繁创建对象时的效率问题。在示例中,`Monster`类作为基类,`Archer`和`Knight`是其派生类,各自实现了深拷贝的`Clone`方法。`Spawner`类用于根据原型生成不同类型的怪物。注意深拷贝和浅拷贝的区别,确保对象状态的一致性。这种模式常用于游戏开发中创建不同状态的角色或对象。
摘要由CSDN通过智能技术生成

原型模式

什么是原型模式

使用特定原型实例来创建特定对象,并通过拷贝原型来创建对象

解决了什么问题

对象创建较复杂,需要频繁创建,简化过程

优势

对创建较复杂的对象,简化创建过程,提高效率

弊端

需要考虑深拷贝与浅拷贝问题
克隆方法位于类内,修改时需要进入类内 违反了开闭原则

示例
class Data
{
public:
    Data(string name)
    {
        Name = name;
    }

    string Name;
};

//怪物基类
class Monster
{
public:

    virtual  ~Monster() {}


    virtual Monster *Clone() = 0;

    virtual void PrintInfo() {}
};

//每一个derive class 都有一个特定的Clone实现 返回一个跟自身状态相同的对象
//注意深浅拷贝的问题
class Archer : public Monster
{
private:
    int HP;
    int MP;
    Data *Name;
public:

    Archer(int hp, int mp, Data *name) : HP(hp), MP(mp), Name(name)
    {

    }

    virtual ~Archer() override
    {

    }


    virtual Monster *Clone() override
    {
        Data *temp = new Data("Clone Acher");
        return new Archer(HP, MP, temp);
    }

public:
    void Set(int hp, string name)
    {
        HP = hp;
        Name->Name = name;
    }

    void PrintInfo() override
    {
        cout << " Hp :" << HP << " Mp: " << MP << " Name: " << Name->Name << endl;
    }
};

class Knight : public Monster
{
private:
    int HP;
    int MP;
    Data *Name;
public:

    Knight(int hp, int mp, Data *name) : HP(hp), MP(mp), Name(name)
    {

    }

    virtual ~Knight() {}

    virtual Monster *Clone() override
    {
        Data *temp = new Data("Clone Knight");
        return new Knight(HP, MP, temp);
    }

public:
    void PrintInfo() override
    {
        cout << " Hp :" << HP << " Mp: " << MP << " Name: " << Name->Name << endl;
    }
};

//创建孵化器 持有原型
class Spawner
{
private:
    Monster *prototype;
public:
    Spawner(Monster *proto) : prototype(proto)
    {

    }

    virtual Monster *spawnMonster()
    {
        return prototype->Clone();
    }
};
int main()
{
    Data *Name = new Data("Archer");
    Data *Name2 = new Data("Kinght");
    Archer *proto = new Archer(15, 120, Name);
    Spawner *ArcherSp = new Spawner(proto);


    Archer *temp1 = (Archer *) ArcherSp->spawnMonster();
    temp1->Set(100, "Asdasd");

    proto->PrintInfo();
    temp1->PrintInfo();
    cout << "-------------------" << endl;
    Knight *proto2 = new Knight(12, 10, Name2);
    Spawner *KnightSp = new Spawner(proto2);
    Knight *temp2 = (Knight *) KnightSp->spawnMonster();
    proto2->PrintInfo();
    temp2->PrintInfo();


}

深拷贝与浅拷贝

当对象属性种包含指针或者引用时 拷贝依然指向同一个实例

对于模型模式 不仅克隆了类类型,而且保留了对象的状态,我们可以通过创建不同生成器来创建不同的对象,例如虚弱的Archer,受伤的Archer等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值