原型模式
原型模式
优缺点
优点:
如果创建新的对象比较复杂,可以利用原型模式简化对象的创建过程,同时也能够提高效率。
简化对象的创建,无需理会创建过程。
可以在程序运行时(对象属性发生了变化)获得一份内容相同的实例,他们之间不会相互干扰。
缺点:
在实现深拷贝时可能需要比较复杂的代码
需要为每一个类配备一个克隆方法,而且该克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事,必须修改其源代码,违背了“开闭原则”。
代码实现
创建抽象原型
// prototype.h
#ifndef PROTOTYPE_H
#define PROTOTYPE_H
// 猴子
class Monkey
{
public:
Monkey(){}
virtual ~Monkey(){}
virtual Monkey* Clone() = 0; // 克隆
virtual void Play() = 0; // 玩耍
};
#endif // PROTOTYPE_H
创建具体原型
// concrete_prototype.h
#ifndef CONCRETE_PROTOTYPE_H
#define CONCRETE_PROTOTYPE_H
#include "prototype.h"
#include <iostream>
#include <string>
using namespace std;
// 孙悟空
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 << " play Golden-Hoop-Stick" << endl;
}
private:
string m_strName;
};
#endif // CONCRETE_PROTOTYPE_H
客户端
// main.cpp
#include "concrete_prototype.h"
#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif
int main()
{
// 孙悟空
Monkey *pSWK = new SunWuKong("Qi Tian Da Sheng");
// 克隆猴子猴孙
Monkey *pSWK1 = pSWK->Clone();
Monkey *pSWK2 = pSWK1->Clone();
pSWK1->Play();
pSWK2->Play();
SAFE_DELETE(pSWK1);
SAFE_DELETE(pSWK2);
SAFE_DELETE(pSWK);
getchar();
return 0;
}

浙公网安备 33010602011771号