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

来源:互联网 发布:电脑版淘宝是哪个版本 编辑:程序博客网 时间:2024/05/15 23:44

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象!
原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节!!
一下实现一个简历的例子:

#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

0 0
原创粉丝点击