设计模式: 9 原型模式

来源:互联网 发布:2017淘宝摇一摇在哪里 编辑:程序博客网 时间:2024/05/20 00:17

原型模式:用原型实例指定创建对象的种类,并且通过拷贝原型创建新的对象。

本质:从一个对象再创建另一个可定制的对象,而不需要知道创建细节。

总结:对客户隐藏对象创建工作,原型模式是通过拷贝一个现有对象生成新对象的,达到了隔离类对象的使用者和具体类型(易变类)之间的耦合关系的迷路。

优点:快速构建相同类型对象,不需关心克隆对象本身类型。

 

浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有其他对象的引用仍然指向原来的对象。

深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

 

 main.cpp

#include <iostream>#include <stdlib.h>#include "Resume.h"#include "ResumeA.h"#include "ResumeB.h"using namespace std;void process(){Resume* r1 = new ResumeA("A");Resume* r2 = new ResumeB("B");Resume* r3 = r1->clone();Resume* r4 = r2->clone();r1->show();r1->fillResume();r2->show();r2->fillResume();delete r1;delete r2;r1 = r2 = NULL;r3->show();r3->fillResume();r4->show();r4->fillResume();delete r3;delete r4;r3 = r4 = NULL;}int main(int argc,char* argv[]){process();system("pause");return 0;}

 

Resume.h

#ifndef RESUME_H#define RESUME_H#include <string>class Resume{public:Resume(void);virtual ~Resume(void);virtual Resume* clone();//克隆,关键所在virtual void set(const std::string& sName);virtual void show();//填写简历void fillResume();protected://保护成员virtual void setPersonalInfo();virtual void setEducation();virtual void setWorkExp();protected:std::string _sName;};#endif


Resume.cpp

#include "Resume.h"#include <iostream>Resume::Resume(void){}Resume::~Resume(void){}Resume* Resume::clone(){return NULL;}void Resume::set(const std::string& sName){}void Resume::show(){}void Resume::fillResume(){setPersonalInfo();setEducation();setWorkExp();}void Resume::setPersonalInfo(){}void Resume::setEducation(){}void Resume::setWorkExp(){}

 

ResumeA.h

#ifndef RESUMEA_H#define RESUMEA_H#include "resume.h"#include <string>class ResumeA :public Resume{public:ResumeA(const std::string& sName);ResumeA(const ResumeA& r);~ResumeA(void);ResumeA* clone();//克隆,关键所在void show();protected:void setPersonalInfo();void setEducation();void setWorkExp();};#endif


ResumeA.cpp

#include "ResumeA.h"#include <iostream>using namespace std;ResumeA::ResumeA(const std::string& sName){_sName = sName;}//拷贝构造函数ResumeA::ResumeA(const ResumeA& r){_sName = r._sName;}ResumeA::~ResumeA(void){_sName = "";}//注意可能内存泄露ResumeA* ResumeA::clone(){return new ResumeA(*this);}void ResumeA::show(){cout << "简历:" << _sName << endl;}void ResumeA::setPersonalInfo(){cout << _sName << "的个人信息" << endl;}void ResumeA::setEducation(){cout << _sName << "的教育" << endl;}void ResumeA::setWorkExp(){cout << _sName << "的工作经验" << endl;}


ResumeB.h

#ifndef RESUMEB_H#define RESUMEB_H#include "resume.h"#include <string>class ResumeB :public Resume{public:ResumeB(const std::string& sName);ResumeB(const ResumeB& r);~ResumeB(void);ResumeB* clone();void show();protected:void setPersonalInfo();void setEducation();void setWorkExp();};#endif


ResumeB.cpp

#include "ResumeB.h"#include <iostream>using namespace std;ResumeB::ResumeB(const std::string& sName){_sName = sName;}ResumeB::ResumeB(const ResumeB& r){_sName = r._sName;}ResumeB::~ResumeB(void){_sName = "";}ResumeB* ResumeB::clone(){return new ResumeB(*this);}void ResumeB::show(){cout << "简历:" << _sName << endl;}void ResumeB::setPersonalInfo(){cout << _sName << "的个人信息" << endl;}void ResumeB::setEducation(){cout << _sName << "的教育" << endl;}void ResumeB::setWorkExp(){cout << _sName << "的工作经验" << endl;}


 



 

 

0 0
原创粉丝点击