大话设计模式c++实现--原型模式

大话设计模式C++实现-第9章-原型模式 一、UML图 二、概念 原型模式(Prototype):用原型示例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 三、说明 (1)原型模式实际上就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。 (2)一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,有对性能是大大的提高。因为如果不用Clone,每次new,都需要执行 阅读详情
1、概念

原型模式(Prototype):用原型示例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

2、说明

(1)原型模式实际上就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。

(2)一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,有对性能是大大的提高。因为如果不用Clone,每次new,都需要执行一次构造函数,如果构造函数的执行时间很长,那么多次的执行这个初始化操作就实在是太低效了。

(3)浅复制和深复制:

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

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

Clone的时候使用深复制。


// designpattern9_prototype.cpp : 定义控制台应用程序的入口点。
//
//原型模式
#include "stdafx.h"
#include <iostream>
#include <string>
//工作经验类:WorkExperience类
class WorkExperience
{
private:
std::string workDate;
std::string company;
public:
WorkExperience(){}
~WorkExperience(){}
//供克隆调用的构造函数
WorkExperience(WorkExperience* 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;
}


//克隆
WorkExperience*  Clone()
{
//调用供克隆调用的构造函数WorkExperience(WorkExperience)
return new WorkExperience(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) = 0;
virtual void Display() = 0;
virtual Prototype* Clone() = 0;


};


//具体原型类,即ConcretePrototype类,本例中为简历Resume类,实现一个克隆自身的操作。
class Resume :public Prototype
{
private:
WorkExperience* work;
public:
Resume(std::string name)
{
this->name = name;
work = new WorkExperience();
}
~Resume()
{
delete work;
}
//供克隆调用的构造函数
Resume(WorkExperience* work)
{
this->work = work->Clone();
}
void SetPersonalInfo(std::string sex, std::string age)
{
this->sex = sex;
this->age = age;
}
void SetWorkExperience(std::string workDate, std::string company)
{
work->setWorkDate(workDate);
work->setCompany(company);
}
void Display()
{
std::cout << name << "  " << sex << "  " << age << std::endl;
std::cout << "工作经历  " << work->getWorkDate() << "  " << work->getCompany() << std::endl;
}


//克隆
Resume* Clone()
{
//调用 供克隆函数调用的构造函数Resume(work)
Resume *cloneResume = new Resume(work);
cloneResume->name = this->name;
cloneResume->age = this->age;
cloneResume->sex = this->sex;
return cloneResume;
}
};


void main()
{
Resume* a = new Resume("大鸟");
a->SetPersonalInfo("男", "29");
a->SetWorkExperience("1998-2000", "XX公司");


Resume* b = a->Clone();
b->SetWorkExperience("1998-2006", "YY公司");


Resume* c = b->Clone();
c->SetPersonalInfo("男", "24");
c->SetWorkExperience("1998-2003", "ZZ公司");

a->Display();
b->Display();
c->Display();

delete a;
delete b;
delete c;
a = b = c = NULL;
system("pause");
}

设计模式C++实现(5)——原型模式、模板方法模式 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大 阅读详情

相关推荐

【大话设计模式】c++实现

共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。享元模式: 共享相同元素,不必为相同的元素new大量的实例,在需要时调取该对象即可, 一种是单纯享元,一种是复合享元,单纯享元的特点是所有元素都是共享的,而复合享元角色对象是不共享的,但是一个复合享元内部对象可以划分为多个共享享元表示;状态模式:当一个对象改变其内在状态时,允许改变其行为。共七种:适配器模式、桥接模式、装饰者模式、代理模式、外观模式、组合模式、享元模式。

qq_47461884的博客 1764

设计模式目录

六个创建型模式 简单工厂模式 工厂方法模式 抽象工厂模式 单例模式 原型模式 建造者模式 七个结构型模式 适配器模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 十一个行为型模式 职责链模式 命令模式 解释器模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 模板方法模式 访问者模...

weixin_30809333的博客 176

std::string、char*、const char*转托管byte数组或托管字符串String

std::string、char*、const char*转托管byte数组或托管字符串String

c++小程序

// stock00.h// Created by 吕百杨 on 2016/10/8.//#ifndef STOCK00_H_STOCK00_H#define STOCK00_H_STOCK00_H#include <string>class Stock{private: std::string company; //公司名称 long shares;//...

diaozanzhu4253的博客 236

描边盛开火玫瑰

python描边盛开火玫瑰 代码如下 import turtle as t t.setup(800,800) t.hideturtle() t.speed(11) t.penup() t.goto(50,-450) t.pensize(5) t.pencolor("black") t.seth(140) t.pendown() t.speed(10) t.circle(-300,60) t.fd(100) #jiaodu80 #1ye t.seth(10) t.fd(50) t.fillcolor("gr

weixin_50973371的博客 2066

STK传感器配置全攻略:从光学到雷达的7种视场类型详解(附避坑指南)

本文详细解析了STK软件中传感器的7种视场类型,从基础的Simple Conic、Complex Conic到高级的SAR与EOIR,提供了完整的配置步骤与实战避坑指南。重点阐述了雷达、光学等不同物理设备的建模选择逻辑,并针对常见的“No Access”等报错问题给出了系统性的排查方案,帮助工程师高效完成卫星系统设计与任务分析。

weixin_29232507的博客 228

类的构造和析构函数(1)

stcok类样例: class stock { private: std::string company; long sharee; double share_val; double total_val; void set_tot(){ total_val=shares*share_val;} public: void acquire(const std::string &co...

不停 345

ONNC Open Neural Network Compiler 开源神经网络编译器 一个 开源、模块化、可重用编译器算法和工具链的库,专门针对深度学习加速器(DLA)部署导入ONNX模型

ONNC是一个集合了开源、模块化、可重用编译器算法和工具链的库,专门针对深度学习加速器(DLA)。ONNC从底层开始构建,旨在将ONNX中间表示(IR)翻译成专有DLA代码。其软件架构设计强调可移植性和可重用性,从而简化了开发新后端的工作。上图展示了ONNC软件栈的顶层框图。软件栈从导入ONNX计算图模型到输出相应的硬件二进制文件,展示了各个功能块。

万有文的博客 1997

std::string详解

之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C++的基本数据类型。 标准模板库(STL)提供了一个std::strin

debugconsole的专栏 1万+

SYSU-MM01数据集评估避坑指南:从RGB/IR图像理解到Python评估脚本调优

本文详细解析了SYSU-MM01数据集在跨模态行人重识别(ReID)评估中的关键技巧与常见陷阱。从RGB/IR图像理解到Python评估脚本优化,提供了数据评估模式选择、single-shot/multi-shot差异分析、特征文件处理规范等实用指南,帮助研究者避开指标异常问题,提升评估效率与准确性。

weixin_29044713的博客 196

mysql笔记:23. 在Mac上安装与卸载MySQL

MySQL对Mac电脑的适配十分强大,再加上Mac本身就是Unix操作系统演化而来的,所以在Mac上安装MySQL的方式有多种。常见的方法有如下三种:DMG、brew、TAR。介绍这些方法前,我们先了解下MySQL安装文件的下载。

斌斌(Java) 2250

《大话设计模式》c++实现 原型模式

意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 主要解决:在运行期建立和删除原型。 何时使用:1、当一个系统应该独立于它的产品创建,构成和表示时。 2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。 如何解决:利用已有的一个原型对象,快速地生成和原型对象一样的实例。 使用场景:1、资源优化场景。 2、类初始化需要消化非常多的资源,这个资源包括数...

anqiu4023的博客 227

Cursor插件安装CodeX保姆级教程:从登录到调整面板布局,一步不落

本文提供Cursor编辑器安装CodeX插件的详细教程,涵盖从登录到调整面板布局的全流程。通过优化界面布局和配置参数,帮助开发者提升编码效率,特别适合需要智能代码补全的编程场景。

weixin_42648844的博客 4766

大话设计模式原型模式c++实现

原型模式 其他二十三种设计模式 #include<iostream> using namespace std; //原型模式(Prototype) class Person { public: virtual Person* Clone() = 0; }; class WorkExperience :public Person{ public: WorkExperience() {} ~WorkExperience() {} WorkExperience(string _workD

wode_0828的博客 200

Unity零基础到入门 ☀️| 基础知识入门篇章,看完就可以做游戏啦! | 寻找C站宝藏

Unity入门基础知识。本篇文章介绍了关于Unity入门的一些基础知识,包括基本概念和使用实例。简单易上手,轻松实现Unity入门操作!

努力前行,总会成为自己心中的那道光 1万+

破解现代反爬虫:JS加密、OB混淆与CSS反爬的实战攻防分析

摘要: 随着反爬技术的升级,JS加密、OB混淆和CSS反爬成为主流防护手段,阻碍传统爬虫获取数据。本文解析了这些技术的工作原理,并提出破解策略:通过模拟浏览器(如Selenium、Puppeteer)执行动态JS,逆向混淆代码,以及利用开发者工具突破CSS隐藏。针对复杂防护,开发者需结合技术分析与工具应用,如API接口抓取、动态渲染破解等,以应对不断演进的反爬机制。未来,爬虫攻防将持续升级,需保持技术敏锐性。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1649

大话设计模式 —— 第九章《原型模式》C++ 代码实现

目录 概述 定义 优点 缺点 使用场景 注意事项 浅复制和深复制 概述 在某些情况下,可能不希望反复使用类的构造函数创建许多不同的对象,而是希望使用该类创建一个对象后,以该对象为原型得到该对象的若干个副本 ( 分深拷贝 和 浅拷贝)。也就是说,当一个对象定义为原型对象时,该对象中提供了一个 Clone 方法,然后该原型对象调用此方法可以“克隆”原型对象得到一个新对象。原型对象 ...

TAOTAO 688

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

大话设计模式——原型模式(C++简历实现)

C++写过拷贝构造函数和赋值运算符重载的应该都会

Ben_OnceMore 953

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

大话设计模式--原型模式 Prototype -- C++实现

1. 原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。。。 注意: 拷贝的时候是浅拷贝 还是 深拷贝, 来考虑是否需要重写拷贝构造函数。 关键在于: virtual Prototype* clone();  克隆函数。。。返回一个克隆的对象。   实例: 以深拷贝为例 prototype.h   prototype.cpp #ifndef PROTOTY

kevin_xiang的专栏 716

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

09 大话设计模式C++实现之原型模式9.3&9.4

9.3 原型模式: #include<iostream> #include<string> using namespace std; /* 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象,原型模式实际上就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节 一般在初始化信息不发生变化的情况下,克隆是最好的办法。这样既隐藏了对象创建的细...

Woosual的博客 284

09 大话设计模式C++实现之原型模式之理解深拷贝和浅拷贝

1. 赋值构造函数的四种调用场景(调用时机) 场景1: #include "iostream" using namespace std; class AA { public: AA() //无参构造函数 默认构造函数 { cout...

Woosual的博客 580

C++实现原型模式(复制简历)

1.克隆对象比直接创建对象的优点在于,克隆是将原有对象的行为属性带到了新的对象中。 2.C++没有克隆方法,要克隆一个对象,需要借助拷贝构造函数来实现。拷贝构造函数中实现拷贝对象有浅拷贝和深拷贝: 浅拷贝是指对象复制时,只是对于对象中的数据成员进行值拷贝;深拷贝是指对象赋值时,对于对象的简单数据成员进行值拷贝,对于对象中的动态成员(堆或者其他系统资源),要重新分配动态空间。 当类不定义拷贝构

Rambo的专栏 786

大话设计模式解读06-原型模式

本篇,来介绍《大话设计模式》的第9章——原型模式。并通过C++代码实现实例代码的功能。

码农爱学习的博客 1332

C++ 实现设计模式(原型模式)

原型模式:**用原型实例来制定创建对象的种类,并且通过拷贝这些原型来创建新的对象。**注意这里是新的对象,而我们一般的拷贝是浅拷贝,当我们把原版(第一份delete时),后面的浅拷贝的对象全部失效。所以这里使用原型模式 因为已经实际的拷贝出来几个副本,即使原版内存被释放也没有影响。 //没有使用原型模式 Resume *pp = new Resume("大鸟"); pp->SetSex...

karol_peng的博客 1997

c++设计模式(原型模式)

原型模式(《大话设计模式》): 用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象 从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。 c++本身是有拷贝构造的,那么原型模式有什么好处呢? 我自己感觉,和拷贝构造相比,隐藏了拷贝的细节,把拷贝构造进行了封装 下面这个例子,我用了继承和多态,再加上智能指针,用起来给我自己对大的感受就是不用动脑子,我都不需要知道...

Hyl的博客 2666
上一篇: 大话设计模式8 c++实现——工厂方法模式
下一篇: 大话设计模式c++实现---建造者模式
Watson2016
博客等级 码龄11年 342粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值