《大话设计模式》c++实现 原型模式
意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
主要解决:在运行期建立和删除原型。
何时使用: 1、当一个系统应该独立于它的产品创建,构成和表示时。 2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。
如何解决:利用已有的一个原型对象,快速地生成和原型对象一样的实例。
使用场景: 1、资源优化场景。 2、类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。 3、性能和安全要求的场景。 4、通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。 5、一个对象多个修改者的场景。 6、一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。 7、在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。原型模式已经与 Java 融为浑然一体,大家可以随手拿来使用。
浅复制:被复制的对象的所有变量都含有与原来的对象相同的值,而所有对其他对象的引用都仍然指向原来的对象。
深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
#include<iostream>
#include<string> //WorkExperience类
class WorkExprerience{
private:
std::string workDate;
std::string company;
public:
WorkExprerience(){}
~WorkExprerience(){} WorkExprerience(WorkExprerience* work){
this->workDate = work->workDate;
this->company = work->company;
}
std::string getWorkDate(){
return workDate;
}
void setWorkDate(std::string workDate){
this->workDate = workDate;
}
std::string getCompany(){
return company;
}
void setCompany(std::string company){
this->company = company;
} //clone
WorkExprerience* Clone(){
return new WorkExprerience(this);
}
}; //原型类,声明一个克隆自身的接口。
class Prototype{
protected:
std::string name;
std::string sex;
std::string age;
std::string timeArea;
std::string company;
public:
virtual void SetPersonalInfo(std::string sex, std::string age) = ;
virtual void Display() = ;
virtual Prototype* Clone() = ;
}; //具体原型类,即ConcretePrototype类,本例中为简历Resume类,实现一个克隆自身的操作
class Resume :public Prototype{
private:
WorkExprerience * workExp;
public:
Resume(std::string name){
this->name = name;
workExp = new WorkExprerience();
}
~Resume(){
if (workExp != NULL)
delete workExp;
}
//克隆需要的构造函数
Resume(WorkExprerience* workExp){
this->workExp = workExp->Clone();
}
void SetPersonalInfo(std::string sex, std::string age){
this->sex = sex;
this->age = age;
}
void SetWorkExperience(std::string company,std::string workDate){
workExp->setCompany(company);
workExp->setWorkDate(workDate);
}
void Display(){
std::cout << name << " " << age<<" "<<sex << " " << std::endl;
std::cout << "工作经历 " << workExp->getWorkDate() << " " << workExp->getCompany() << std::endl;
}
Resume* Clone(){
Resume* clonedResume = new Resume(workExp);
clonedResume->name = this->name;
clonedResume->sex = this->sex;
return clonedResume;
}
}; void main(){
Resume* a = new Resume("big bird");
a->SetPersonalInfo("MAN", "");
a->SetWorkExperience("1998-2000", "baidu"); Resume* b = a->Clone();
b->SetWorkExperience("2000-2008", "google"); Resume* c = a->Clone();
c->SetPersonalInfo("MAN", "");
c->SetWorkExperience("2000-2008", "apple"); a->Display();
b->Display();
c->Display();
system("pause");
}
参考:
https://blog.csdn.net/xiqingnian/article/details/41983337
http://www.runoob.com/design-pattern/prototype-pattern.html
《大话设计模式》c++实现 原型模式的更多相关文章
- 大话设计模式Python实现-原型模式
原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 一个原型模式的简单demo: #!/usr/bin/env python # -*- c ...
- C#《大话设计模式》之原型模式学习日记
class Program { static void Main(string[] args) { Resume a = new Resume("大鸟"); a.SetPerson ...
- java23种设计模式——四、原型模式
源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...
- Net设计模式实例之原型模式( Prototype Pattern)
一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...
- Java设计模式5:原型模式
原型模式 原型模式属于对象的创建模式,通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的用意. 原型模式结构 原型模式要求对象实现一个 ...
- 大话设计模式C++版——代理模式
本篇开始前先发个福利,程杰的<大话设计模式>一书高清电子版(带目录)已上传至CSDN,免积分下载. 下载地址:http://download.csdn.net/detail/gufeng9 ...
- 大话设计模式C++版——工厂模式在COM中的典型应用
上篇<大话设计模式C++版——抽象工厂模式>中,我们拯救世界未遂,留下小小的遗憾,本篇中我们将给出一个解决方案——COM组件技术,同时也顺便扯扯工厂模式在COM组件技术中的应用. 工厂模式 ...
- 设计模式学习心得<原型模式 Prototype >
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式是实现了一个原型接口,该接口用于创建当 ...
- IOS设计模式浅析之原型模式(Prototype)
原型模式的定义 “使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象”.最初的定义出现于<设计模式>(Addison-Wesley,1994). 简单来理解就是根据这个原型创建 ...
- 大话设计模式Python实现-迭代器模式
迭代器模式(Iterator Pattern):提供方法顺序访问一个聚合对象中各元素,而又不暴露该对象的内部表示. 下面是一个迭代器模式的demo: #!/usr/bin/env python # - ...
随机推荐
- iOS-原生纯代码约束总结(二)之 AutoLayout
一,概述 AutoLayout相比AutoResizing更加实用,是可以完全替代AutoResizing的一种自动布局方式.而在使用AutoLayout前,我们必须理解一个属性,那就是transla ...
- textfield内边距
使用QMUITextField self.inputTf.textInset = UIEdgeInsetsMake(0, -6, 0, 10);
- Fiddler怎么可以抓取https的请求包
对于https的协议是带有安全的功能,所有有一些的https的协议是无法抓到的,所以需要通过设置filler中来对,来使用filler的方式的来抓取到https的请求包,那么如何使用filler中抓取 ...
- http请求的基本介绍
响应码 1xx:接收到请求并且继续处理 ,这个是一瞬间的状态,一般不关注 2xx:请求已被接收,理解,处理,表示正确 3xx:请求重定向 4xx:客户请求语法错误或者请求资源不存在,这个是客户端错误 ...
- numpy——.npy和.npz文件
npy文件--Numpy专用的二进制格式np.load()和np.save()是读写磁盘数组数据的两个重要函数.使用时,数组会以未压缩的原始二进制格式保存在扩展名为.npy的文件中. import n ...
- Python开发【笔记】:接口压力测试
接口压力测试脚本 1.单进程多线程模式 # #!/usr/bin/env python # # -*- coding:utf-8 -*- import time import logging impo ...
- Java 用HTTP的方式发送JSON报文请求
前言: 项目调用第三方接口时,通常是用socket或者http的通讯方式发送请求:http 为短连接,客户端发送请求都需要服务器端回送响应,请求结束后,主动释放链接.Socket为长连接:通常情况下S ...
- VS Code Html Zen coding
zen coding是一种编写html和css的方法, 很快捷. 打开Views/Home/About.cshtml, 然后在空白处输入div然后按Tab: 随后完整的div标签就出来了: zen c ...
- FastList使用
之前使用的组件是ListView,当时要添加一个下拉刷新,上拉加载的功能,所以对ListView做了一些封装,但是后来看官方文档,不建议再使用ListView,因为效率问题,做过Android的朋友都 ...
- 使用 HTMLTestRunner 模块生成HTML格式的测试报告文件
1.下载HTMLTestRunner.py HTMLTestRunner 是 Python 标准库的 unittest 模块的一个扩展.它生成易于使用的 HTML 测试报告.HTMLTestRunne ...