1、GraphPrototype.h
#ifndef GRAPHPROTOTYPE_H
#define GRAPHPROTOTYPE_H
class GraphPrototype //原型基类. 图型
{
public:
GraphPrototype(){};
~GraphPrototype(){};
virtual GraphPrototype* Clone() = 0;
};
#endif // GRAPHPROTOTYPE_H
2-1、curveprototype.h
#ifndef CURVEPROTOTYPE_H
#define CURVEPROTOTYPE_H
#include <iostream>
#include <string>
using namespace std;
#include "GraphPrototype.h"
class CurvePrototype : public GraphPrototype //原型具体类. 曲线
{
protected:
string strType;
public:
CurvePrototype(){};
CurvePrototype(const CurvePrototype &cp); //拷贝构造函数
~CurvePrototype(){};
GraphPrototype* Clone();
void SetType(string strType);
void Print();
};
#endif // CURVEPROTOTYPE_H
2-2、curveprototype.cpp
#include "curveprototype.h"
CurvePrototype::CurvePrototype(const CurvePrototype &cp) //拷贝构造函数
{
this->strType = cp.strType;
}
GraphPrototype* CurvePrototype::Clone()
{
cout << "clone a curve" << endl;
return new CurvePrototype(*this);
}
void CurvePrototype::SetType(string strType)
{
this->strType = strType;
}
void CurvePrototype::Print()
{
cout << "beeline type is: " << strType.c_str() << endl;
}
3-1、lineprototype.h
#ifndef LINEPROTOTYPE_H
#define LINEPROTOTYPE_H
#include <iostream>
#include <string>
using namespace std;
#include "GraphPrototype.h"
class LinePrototype : public GraphPrototype //原型具体类. 直线
{
protected:
int weight;
public:
LinePrototype(){};
~LinePrototype(){};
LinePrototype(const LinePrototype &lp); //拷贝构造函数
GraphPrototype* Clone();
void SetWeight(int weight);
void Print();
};
#endif // LINEPROTOTYPE_H
3-2、lineprototype.cpp
#include "lineprototype.h"
LinePrototype::LinePrototype(const LinePrototype &lp) //拷贝构造函数
{
this->weight = lp.weight;
}
GraphPrototype* LinePrototype::Clone()
{
cout << "clone a line" << endl;
return new LinePrototype(*this);
}
void LinePrototype::SetWeight(int weight)
{
this->weight = weight;
}
void LinePrototype::Print()
{
cout << "line weight is: " << weight << endl;
}
4、main.cpp
/*
作者:jhluroom弹 QQ:454676244 MSN:jhlu0815@hotmail.com
开发IDE:qt creater
开发环境:QT C++
参考网站:神秘果:http://www.shenmiguo.com/
定义:
用原型(Prototype)实例指定创建对象的种类,通过拷贝这些原型,从而创建新的对象。
理解:
1.Prototype是原型基类,提供Clone纯虚方法,它根据不同的派生类来克隆不同的对象。
2.ConcretePrototype是原型具体类。实现Clone方法,克隆自己,返回克隆后的新对象。
3.Client调用基类Clone接口,就可以得到一个克隆对象。
要点:
1.原型模式中,Client并不知道要克隆对象的实际类型,只需知道基类类型即可。
2.克隆对象比直接创建对象的优点在于,克隆是将原有对象的行为属性带到了新的对象中。
3.C++没有克隆方法,要克隆一个对象,需要借助拷贝构造函数(Copy Constructor)来实现。
源码中通过CLONE直线和曲线的例子来实现原型模式:
定义原型类类GraphPrototype、直线子类LinePrototype、曲线子类CurvePrototype加以实现
以上文字说明,从网上整理而来,有可能部分与其他同仁相同,请谅解,希望我们能够共同交流,谢谢!
*/
#include <QtCore/QCoreApplication>
#include "GraphPrototype.h"
#include "lineprototype.h"
#include "curveprototype.h"
GraphPrototype* Clone(GraphPrototype* pPrototype) //Client
{
return pPrototype->Clone();
}
int main(int argc, char *argv[])
{
cout << "=== jhluroom start ========" << endl;
LinePrototype* linePrototype = new LinePrototype();
linePrototype->SetWeight(1234);
GraphPrototype* lineClone1 = Clone(linePrototype);
//将GraphPrototype类型的lineClone1强制转化为LinePrototype类型的lineClone2
LinePrototype* lineClone2 = dynamic_cast<LinePrototype*>(lineClone1);
lineClone2->Print();
CurvePrototype* curvePrototype = new CurvePrototype();
curvePrototype->SetType("jhluroom");
GraphPrototype* curveClone1 = Clone(curvePrototype);
//将GraphPrototype类型的curveClone1强制转化为CurvePrototype类型的curveClone2
CurvePrototype* curveClone2 = dynamic_cast<CurvePrototype*>(curveClone1);
curveClone2->Print();
cout << "=== jhluroom finish _^_ ===" << endl;
return 0;
}
运行结果:
=== jhluroom start ========
clone a line
line weight is: 1234
clone a curve
beeline type is: jhluroom
=== jhluroom finish _^_ ===