第一部分:创建型模式
5. Prototype模式
a. 问题
原型模式:提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。
b. 模式结构
提供了一个通过已存在对象进行新对象创建的接口(Clone),Clone()实现和具体的实现语言相关,在C++中我们将通过拷贝构造函数实现。
c.代码实现
客户端
// main.cpp
#include "concrete_prototype.h"
#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif
int main()
{
// 孙悟空
Prototype *pSWK = new ConcretePrototype("Qi Tian Da Sheng");
// 克隆猴子猴孙
Prototype *pSWK1 = pSWK->Clone();
Prototype *pSWK2 = pSWK1->Clone();
SAFE_DELETE(pSWK1);
SAFE_DELETE(pSWK2);
SAFE_DELETE(pSWK);
getchar();
return 0;
}
创建抽象原型
//Prototype.h
#ifndef _PROTOTYPE_H_
#define _PROTOTYPE_H_
class Prototype {
public:
virtual ~Prototype();
virtual Prototype* Clone() const = 0;
protected:
Prototype();
private:
};
创建具体原型
// concrete_prototype.h
#ifndef CONCRETE_PROTOTYPE_H
#define CONCRETE_PROTOTYPE_H
#include "prototype.h"
#include <iostream>
#include <string>
using namespace std;
// 孙悟空
class ConcretePrototype: public Prototype
{
public:
ConcretePrototype(string name){ m_strName = name; }
~ConcretePrototype(){}
// 拷贝构造函数
ConcretePrototype(const ConcretePrototype &other) {
m_strName = other.m_strName;
}
Prototype* Clone() {
// 调用拷贝构造函数
return new ConcretePrototype(*this);
}
private:
string m_strName;
};
#endif // CONCRETE_PROTOTYPE_H
d.优缺点
优点:如果创建新对象比较复杂,倒是可以考虑根据现有对象拷贝一个
缺点:prototype的实现很简单,关键是拷贝构造函数的实现,实现深拷贝很麻烦