设计模式 原型模式

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 _^_ ===


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值