您的位置:首页 > 其它

设计模式学习(八)————原型模式

2016-09-13 09:24 375 查看
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象!

原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节!!

一下实现一个简历的例子:

#ifndef RESUME
#define RESUME
#include <QString>
#include <QtDebug>

class Resume
{
public:
explicit Resume(QString name):_name(name){}
//    Resume(const Resume & r) //也可以自己实现拷贝构造函数
//    {_name = r._name;_sex=r._sex;_age=r._age;_timeArea=r._timeArea;_company=r._company;}
void setPersonalInf(QString sex, QString age)
{
_sex = sex;
_age = age;
}
void setPersonalExperience(QString timeArea, QString company)
{
_timeArea = timeArea;
_company = company;
}
void display()
{
qDebug() << _name<<","<<_sex<<","<<_age;
qDebug() <<"工作经历:"<<_timeArea <<_company;
}
Resume* clone() {return new Resume(*this);}  //这里返回使用默认拷贝构造函数的结果,因此每个值都拷贝了,没有指针,因此浅拷贝就行!
private:
QString _name;
QString _sex;
QString _age;
QString _timeArea;
QString _company;
};

#endif // RESUME

#ifndef DEEPRESUME
#define DEEPRESUME
#include <QString>
#include <QtDebug>

#define use_shearedPtr   //如果不想使用智能指针,注释掉这一行即可

class WorkExperience
{
public:
explicit WorkExperience(QString ta,QString c):_timeArea(ta),_company(c){}
QString getTimeArea(){return _timeArea;}
QString getCompney() {return _company;}
private:
QString _timeArea;
QString _company;
};

class DeepResume
{
public:
explicit DeepResume(QString name):_name(name){}
DeepResume(const DeepResume & r) //自己实现拷贝构造函数,注意第二行实现的深拷贝!!
//注意:拷贝构造函数可以调用引用参数对象的私有成员!!
//因为拷贝构造函数是放在本身这个类里的,而类中的函数可以访问这个类的对象的所有成员,当然包括私有成员了。
{   _name = r._name;_sex=r._sex;_age=r._age;
#ifdef use_shearedPtr
_we = QSharedPointer<WorkExperience>(new WorkExperience(*r._we));
#else
_we = new WorkExperience(*r._we);
#endif
}
#ifndef use_shearedPtr
DeepResume & operator =(const DeepResume &) = delete;
~DeepResume()
{

if(_we != nullptr)
{
qDebug()<<"删除了构造的工作经验";
delete _we;
_we = nullptr;
}
}
#endif
void setPersonalInf(QString sex, QString age)
{
_sex = sex;
_age = age;
}
void setWorkExperience(WorkExperience *we)
{
#ifdef use_shearedPtr
_we = QSharedPointer<WorkExperience>(we);
#else
_we = we;
#endif
}
void display()
{
qDebug() << _name<<","<<_sex<<","<<_age;
qDebug() <<"工作经历:"<<_we->getTimeArea()<<_we->getCompney();
}
DeepResume* clone() {return new DeepResume(*this);}  //这里返回使用默认拷贝构造函数的结果,因此每个值都拷贝了,有指针,因此深拷贝才行!
private:
QString _name;
QString _sex;
QString _age;
#ifdef use_shearedPtr
QSharedPointer<WorkExperience> _we;
#else
WorkExperience *_we;
#endif
};

#endif // DEEPRESUME

#include "resume.h"
#include "deepresume.h"
#include <QtDebug>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
//浅拷贝的原型模式
Resume *xd=new Resume("小东");
xd->setPersonalExperience("2015-2016","恒通");
xd->setPersonalInf("male","27");
Resume xdd(*xd);
xdd.display();
xd->display();
//深拷贝的原型模式
DeepResume *xc = new DeepResume("小崔");
xc->setPersonalInf("male","28");
xc->setWorkExperience(new WorkExperience("2000-2001","电力"));
DeepResume xcc(*xc);
delete xc;   //因为使用了深拷贝,因此这里就算删除了xc,下面的函数依然可以正常运行,调用里面的WorkExperience类
xcc.display();
//xc->display();
return 0;
}


使用原型模式的核心是实现clone方法,我使用了浅拷贝和深拷贝两种方式来实现,分别写出了对应的clone方法的实现。其中
DeepResume
累我使用普通方法和智能指针两种方法管理里面的数据,如果不想用智能指针,注释掉里面的
#define use_shearedPtr
即可。

最后放上源码地址:https://github.com/Dongzhixiao/designMode_qt/tree/master/resume_prototype_pattern_9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式