设计模式学习(八)————原型模式
来源:互联网 发布:电脑版淘宝是哪个版本 编辑:程序博客网 时间: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
- 设计模式学习(八)————原型模式
- 设计模式学习05—原型模式
- 设计模式—原型模式
- 设计模式—原型模式
- 设计模式—原型模式
- 设计模式—原型模式
- 设计思想学习—原型模式
- 设计模式——原型设计模式
- 设计模式——原型设计模式
- 大话设计模式学习(七)——原型模式
- 设计模式学习笔记——原型模式
- 学习设计模式之禅——原型模式
- 设计模式学习笔记——原型模式
- python 设计模式学习 —— 原型模式
- 设计模式学习笔记——原型模式
- Java设计模式学习04——原型模式
- 设计模式学习5——原型模式
- 设计模式学习笔记——Prototype原型模式
- win10 程序最小化不在任务栏了?在左下角
- Maven项目生成idea项目文件
- Qt 窗口置顶
- Java判断是否为手机端访问
- 分组加密的四种模式
- 设计模式学习(八)————原型模式
- chrome页面撑开一点位置
- sparkstreaming之实时数据流计算实例
- Mysql在Ubuntu上面彻底删除与安装
- oracle——将指定用户下所有表的查询权限赋权给查询用户
- CUDA函数库调用问题解决
- Cookie入门
- 推荐算法概览
- bowtie2安装