设计模式学习(八)————原型模式
2016-09-13 09:24
375 查看
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象!
原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节!!
一下实现一个简历的例子:
使用原型模式的核心是实现clone方法,我使用了浅拷贝和深拷贝两种方式来实现,分别写出了对应的clone方法的实现。其中
最后放上源码地址:https://github.com/Dongzhixiao/designMode_qt/tree/master/resume_prototype_pattern_9
原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节!!
一下实现一个简历的例子:
#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
相关文章推荐
- .Net设计模式学习笔记(六):原型模式(Prototype Pattern)
- 设计模式学习笔记(六)——Prototype原型模式
- 步步为营 .NET 设计模式学习笔记 五、Prototype(原型模式)
- 设计模式学习笔记(原型模式)
- 设计模式学习笔记(十一)—Prototype原型模式
- 设计模式学习-Prototype(原型)
- 设计模式学习笔记-原型模式
- 步步为营 .NET 设计模式学习笔记 五、Prototype(原型模式)
- 设计模式学习之--原型模式(Prototype)
- java 设计模式学习笔记(8) - 原型模式
- 设计模式学习笔记(六)——Prototype原型模式
- 设计模式学习笔记(六)——Prototype原型模式
- 设计模式学习总结4 - 创建型4 - Prototype原型模式
- 阿Sam的设计模式学习笔记---- 原型(Prototype)模式
- 设计模式学习笔记(六)——Prototype原型模式
- 设计模式学习笔记九:原型模式(Prototype Pattern)
- C#面向对象设计模式学习笔记(5) - Prototype 原型模式(创建型模式)
- 设计模式学习----Prototype原型模式
- 设计模式学习-每日一记(6.原型模式)
- 设计模式学习之工厂方法模式和原型模式