假设你还是一名游戏程序员,上次三种类型怪物的工厂设计模式游戏策划非常喜欢,他接着又提出了新的需求,怪物在被玩家攻击以后,会损失一些状态(比如生命值、攻击力)。
现在怪物有了一个新的能力,他能够克隆出一个新的自己,并且状态完全和自己一样。
你该如何实现呢?
如果我们仍然使用以前的工厂模式来实现这个功能,会遇到一个麻烦,那就是我们需要获取我们当前怪物对象的属性,然后再通过工厂模式实现创建新的对象。这样太麻烦了,因为我们通过构造函数,就可以构造出和他一模一样的对象出来。
因此,我们只需要给父类增加拷贝构造,然后在子类中实现一个克隆接口就可以了。
#include
using namespace std;
namespace hjl_project1
{
//怪物父类
class Monster
{
public:
Monster(int life, int magic, int attack)
: m_life(life), m_magic(magic), m_attack(attack)
{
}
//父类实现其构造函数
Monster(const Monster &m)
: m_life(m.m_life), m_magic(m.m_magic), m_attack(m.m_attack)
{
}
//增加一个克隆函数
virtual Monster *clone() = 0;
virtual ~Monster() {}
protected:
//怪物属性
int m_life;
int m_magic;
int m_attack;
};
//亡灵类怪物
class M_Undead : public Monster
{
public:
M_Undead(int life, int magic, int attack)
: Monster(life, magic, attack)
{
cout << "创建了一个亡灵类怪物" << endl;
}
M_Undead(const M_Undead &m)
: Monster(m)
{
cout << "进行了一次克隆" << endl;
printf("克隆对象的生命值:%d 魔法值:%d 攻击力%d\n", m.m_life, m.m_magic, m.m_attack);
}
Monster *clone()
{
return new M_Undead(*this);
}
};
//元素类怪物
class M_Element : public Monster
{
public:
M_Element(int life, int magic, int attack)
: Monster(life, magic, attack)
{
cout << "创建了一个元素类怪物" << endl;
}
M_Element(const M_Undead &m)
: Monster(m)
{
}
Monster *clone()
{
return new M_Element(*this);
}
};
//机械类怪物
class M_Mechanic : public Monster
{
public:
M_Mechanic(int life, int magic, int attack)
: Monster(life, magic, attack)
{
cout << "创建了一个机械类怪物" << endl;
}
M_Mechanic(const M_Undead &m)
: Monster(m)
{
}
Monster *clone()
{
return new M_Mechanic(*this);
}
};
//实现工厂模式,代码省略
}
int main()
{
hjl_project1::Monster *p1 = new hjl_project1::M_Undead(400, 0, 1);
hjl_project1::Monster *p2 = p1->clone();
return 0;
}
原型模式是用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。它属于创建型设计模式,用于创建重复的对象,同时又能保证性能(用这种方式创建对象非常高效)。
优缺点: