什么是原型模式
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象,简单理解就是“克隆指定对象”
为什么使用原型模式
某些结构复杂的对象的创建工作中由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。此时便可以使用原型模式。
原型模式实现步骤
1.提供一个抽象原型类:规定了具体原型对象必须实现的接口。
2.提供多个具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
3.提供访问类:使用具体原型类中的 clone() 方法来复制新的对象。
原型模式实现代码
#include<iostream>
#include <string>
using namespace std;
// 猴子
class Monkey
{
public:
Monkey() {}
virtual ~Monkey() {}
virtual Monkey* Clone() = 0; // 克隆
virtual void Play() = 0; // 玩耍
};
// 孙悟空
class SunWuKong : public Monkey
{
public:
SunWuKong(string name) { m_strName = name; }
~SunWuKong() {}
// 拷贝构造函数
SunWuKong(const SunWuKong& other) {
m_strName = other.m_strName;
}
Monkey* Clone()
{
// 调用拷贝构造函数
return new SunWuKong(*this);
}
void Play() {
cout << m_strName << ":金箍棒" << endl;
}
private:
string m_strName;
};
int main()
{
// 孙悟空
Monkey* monkey = new SunWuKong("齐天大圣孙悟空");
// 克隆猴子猴孙
Monkey* m1= monkey->Clone();
Monkey* m2 = m1->Clone();
m1->Play();
m2->Play();
delete monkey;
delete m1;
delete m2;
return 0;
}
原型模式优缺点
优点
1.如果创建新的对象比较复杂,可以利用原型模式简化对象的创建过程,同时也能够提高效率。
2.简化对象的创建,无需理会创建过程。
3.可以在程序运行时(对象属性发生了变化)获得一份内容相同的实例,他们之间不会相互干扰
缺点
每一个类都必须配备一个克隆方法,对于已有的没有克隆方法的类来说是致命的。