设计模式: 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
- 设计模式: 9 原型模式
- 设计模式:原型模式
- 设计模式------原型模式
- 设计模式 原型模式
- 设计模式-【原型模式】
- 设计模式-原型模式
- 设计模式-原型模式
- 设计模式-原型模式
- 设计模式-原型模式
- 设计模式- 原型模式
- 设计模式:原型模式
- 设计模式 - 原型模式
- 设计模式-原型模式
- 【设计模式】原型模式
- 设计模式-原型模式
- 设计模式-原型模式
- 【设计模式】原型模式
- 设计模式----原型模式
- 设计模式:7 代理模式
- 王昊奋:大规模知识图谱技术
- 知识图谱相关会议之观后感分享与学习总结
- 【解惑】一文告诉你,该学R还是Python!
- [UVA 1629]Cake slicing[记忆化搜索]
- 设计模式: 9 原型模式
- HDU1556-Color the ball-线段树成段更新入门题/前缀和
- 干货 知识图谱研究青年学者研讨会在清华大学顺利召开刘知远 报告题目:大规模知识图谱表示学习的研究趋势与挑战
- 设计模式:10 模板方法模式
- 知识图谱技术原理介绍
- 初次尝试用devc++ 写自定义头文件 遇到的问题
- 知识图谱——机器大脑中的知识库
- _DataStructure_C_Impl:Dijkstra算法求最短路径
- Deep Learning 和 Knowledge Graph 引爆大数据革命