设计模式: 9 原型模式
2015-08-12 01:57
483 查看
原型模式:用原型实例指定创建对象的种类,并且通过拷贝原型创建新的对象。
本质:从一个对象再创建另一个可定制的对象,而不需要知道创建细节。
总结:对客户隐藏对象创建工作,原型模式是通过拷贝一个现有对象生成新对象的,达到了隔离类对象的使用者和具体类型(易变类)之间的耦合关系的迷路。
优点:快速构建相同类型对象,不需关心克隆对象本身类型。
浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有其他对象的引用仍然指向原来的对象。
深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
main.cpp
Resume.h
Resume.cpp
ResumeA.h
ResumeA.cpp
ResumeB.h
ResumeB.cpp
本质:从一个对象再创建另一个可定制的对象,而不需要知道创建细节。
总结:对客户隐藏对象创建工作,原型模式是通过拷贝一个现有对象生成新对象的,达到了隔离类对象的使用者和具体类型(易变类)之间的耦合关系的迷路。
优点:快速构建相同类型对象,不需关心克隆对象本身类型。
浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有其他对象的引用仍然指向原来的对象。
深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
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; }
相关文章推荐
- vim字符串替换
- 干货 知识图谱研究青年学者研讨会在清华大学顺利召开刘知远 报告题目:大规模知识图谱表示学习的研究趋势与挑战
- 【解惑】一文告诉你,该学R还是Python!
- 设计模式:7 代理模式
- 知识图谱相关会议之观后感分享与学习总结
- 黑马程序员Java笔记——初识Java
- 王昊奋:大规模知识图谱技术
- 搜索引擎知识图谱相关结构化数据挖掘与去歧处理
- 在Ubuntu上安装与配置ejabberd
- 设计模式:6 装饰模式
- 2.x ESL第二章习题2.4
- 求gcd(a,b) = ax + by中的gcd(a, b)、a、b(扩展欧几里得算法尾递归版)
- 实现手机QQ的抖动效果
- 【转载】PyTables Windows平台安装说明
- !HDU 5371 最长双回文串(多校7)-卡时间-(manacher+排序+set+lower_bound())
- Keil使用malloc异常进入hardfault调试故障手记
- 08 JAVA 线程 内存模型(二)
- 天猫首页迷思之-jquery实现左侧广告牌图片轮播
- 用WinHex找回丢失的分区
- HDU 3577 Fast Arrangement