原型模式在DP书上的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。接下来我们以一个简单的例子来进行分析:
玩过英雄联盟的都知道,英雄联盟有一个英雄:萨科(恶魔小丑),它的大招就是创建一个分身,除了不能放技能其它属性都与本体差不多。
我们如何实现这个分身的功能呢?其实就是使用原型模式;原型模式就是这么一个道理,通过现有的东西,再复制拷贝出一个或者多个。在这个案例上我们使用原型模式的好处:
1 这个分身是游戏过程中动态生成的。萨科使用了这个功能就动态生成分身。
2 这个分身几乎就是萨科的拷贝。我们如果重新new一个萨科不符合游戏规则。
3 重新创建一个萨科很麻烦,要初始化各种参数,如英雄等级,法术强度,攻击力等等各个参数,而且这些参数要和原型一致。
4 便于扩展。分身有75%原萨科的属性并且多承受50%的伤害,那么我们只要直接修改Clone方法即可。
代码实现如下:
//英雄类
class Hero
{
public:
Hero(int damage,int spellpower)//构造函数
{
SetDamage(damage);
SetSpellPower(spellpower);
}
Hero(const Hero & h) //拷贝构造函数
{
SetDamage(h.m_damage);
SetMagic(h.m_spellpower);
}
void SetDamage(int damage)
{
m_damage = damage;
}
void SetSpellPower(int spellpower)
{
m_spellpower = spellpower;
}
virtual ~Hero(){}
virtual Hero* Clone() = 0;
protected:
int m_damage;//攻击力
int m_spellpower;//魔法
};
//复制英雄类
class CopyHero : public Hero
{
public:
CopyHero(int damage,int spellpower) : Hero(damage,spellpower){}
~CopyHero(){}
CopyHero(const CopyHero& CH) : Hero(CH) //拷贝构造函数
{}
Hero* Clone()
{
CopyHero* CH = new CopyHero(*this);
CH->SetDamage(0);
CH->SetMagic(0);
return bm;
}
};
原型模式的结构和实现都很简单,其关键就是(C++中)拷贝构造函数的实现方式。更简单的说,原型模式其实就是在要使用一个类,但是不能改变自身的情况下,生成一个新的子类去完成这项操作。
以上内容纯粹属于个人理解,如果有错误,感谢大家的指正,谢谢!