原型模式
什么是原型模式
使用特定原型实例来创建特定对象,并通过拷贝原型来创建对象
解决了什么问题
对象创建较复杂,需要频繁创建,简化过程
优势
对创建较复杂的对象,简化创建过程,提高效率
弊端
需要考虑深拷贝与浅拷贝问题
克隆方法位于类内,修改时需要进入类内 违反了开闭原则
示例
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等