设计模式之原型模式Prototype的C++实现
1、原型模式提出
在软件功能设计中,经常面临着“某些结构复杂的对象”的创建工作,且创建的对象想拥有其他对象在某一刻的状态,则可以使用原型模型。原型模型是通过拷贝构造函数来创建对象,并且该对象拥有其他对象在某一刻的状态。
2、需求描述
设计产品A,B,这个产品有重量和单价,输出产品的价格。
3、原型模式代码实现
#include <iostream>
namespace factModel{
class AbsProduct{
public:AbsProduct(int kg,int price):m_kg(kg),m_price(price){};virtual void salePrice()=0;virtual AbsProduct* clone()=0;virtual ~AbsProduct()=default;
protected:int m_kg;int m_price;
};
class ProductA:public AbsProduct
{
public:ProductA(int kg,int price):AbsProduct(kg,price){};ProductA(const ProductA& org):AbsProduct(org.m_kg,org.m_price){this->m_kg = org.m_kg;this->m_price = org.m_kg;};virtual AbsProduct* clone() override{return new ProductA(this->m_kg,this->m_price);};virtual void salePrice()override{std::cout << "ProductA Info "<< m_kg << "kg, price " << m_price << ", sale " << m_kg * m_price<<"."<< std::endl;};~ProductA()=default;
};class ProductB:public AbsProduct
{
public:ProductB(int kg,int price):AbsProduct(kg,price){};ProductB(const ProductB& org):AbsProduct(org.m_kg,org.m_price){this->m_kg = org.m_kg;this->m_price = org.m_kg;};virtual AbsProduct* clone()override{return new ProductB(this->m_kg,this->m_price);};virtual void salePrice()override{std::cout << "ProductB Info "<< m_kg << "kg, price " << m_price << ", sale " << m_kg * m_price<<"."<< std::endl;};~ProductB()=default;
};//有构造参数时,是需要的具体工厂的,因为设计模式一般将new隔离在其他的文件中。(否则使用时就需要AbsProduct *pA = new ProductA(2,8);)
class AbsFact{
public:AbsFact()=default;virtual ~AbsFact()=default;virtual AbsProduct* createProduct()=0;
};
class FactA:public AbsFact
{
public:FactA()=default;~FactA()=default;virtual AbsProduct* createProduct()override{AbsProduct* tmp = new ProductA(2,8);return tmp;}
};class Use
{
public:AbsProduct* product;void setFactory(AbsProduct* pf){product = pf;}; //或者在构造函数中添加初始化字段值void saleProducts(){product->salePrice();}
};
}int main()
{//创建方式1:通过工厂方法模式隔离ProductA的newfactModel::AbsFact* pFactA = new factModel::FactA();factModel::AbsProduct *pPdtA = pFactA->createProduct();factModel::AbsProduct* pCloneA = pPdtA->clone();factModel::Use objA;objA.setFactory(pCloneA);objA.saleProducts();//创建方式2:直接使用new ProductB的方式创建对象factModel::AbsProduct *pPdtB = new factModel::ProductB(3,12);factModel::AbsProduct* pCloneB = pPdtB->clone();factModel::Use objB;objB.setFactory(pCloneB);objB.saleProducts();delete pFactA;pFactA = nullptr;delete pPdtA;pPdtA = nullptr;delete pCloneA;pCloneA = nullptr;delete pPdtB;pPdtB = nullptr;delete pCloneB;pCloneB = nullptr;return 0;
}
运行结果如下:

上面代码main函数中的创建方式根据实际情况选择,如果想隔离new,则使用方式1。原型模式的优点是将创建对象(该新创建的对象具有其他对象的状态,但与其他对象的地址区域是相互独立的)变得比较简洁。
相关文章:
设计模式之原型模式Prototype的C++实现
1、原型模式提出 在软件功能设计中,经常面临着“某些结构复杂的对象”的创建工作,且创建的对象想拥有其他对象在某一刻的状态,则可以使用原型模型。原型模型是通过拷贝构造函数来创建对象,并且该对象拥有其他对象在某一刻的状态。…...
Java 中操作 Redis
文章目录 一、Redis 常用数据类型二、Redis 常用操作命令1. 字符串命令2. 哈希命令3. 列表命令4. 集合命令5. 有序集合命令6. 通用命令 三、在 Java 中操作 Redis1. 导入 maven 坐标2. 配置 Redis 数据源3. 编写配置类 四、在代码中的具体使用 一、Redis 常用数据类型 Redis 存…...
数据结构--最短路径 Dijkstra算法
数据结构–最短路径 Dijkstra算法 Dijkstra算法 计算 b e g i n 点到各个点的最短路 \color{red}计算\ begin\ 点到各个点的最短路 计算 begin 点到各个点的最短路 如果是无向图,可以先把无向图转化成有向图 我们需要2个数组 final[] (标记各顶点是否已…...
在 Linux 虚拟机上使用 Azure 自定义脚本扩展版本
参考 azure创建虚拟机,创建虚拟机注意入站端口规则开放80端口、 2.转到资源,点击扩展应用程序,创建存储账户,创建容器,上传文件,选择文件,会自动执行部署。 apt-get update -y && apt-get insta…...
W5500-EVB-PICO 做UDP Server进行数据回环测试(七)
前言 前面我们用W5500-EVB-PICO 开发板在TCP Client和TCP Server模式下,分别进行数据回环测试,本章我们将用开发板在UDP Server模式下进行数据回环测试。 UDP是什么?什么是UDP Server?能干什么? UDP (User Dataqram P…...
ES搜索引擎入门+最佳实践(九):项目实战(二)--elasticsearch java api 进行数据增删改查
本篇是这个系列的最后一篇了,在这之前可以先看看前面的内容: ES搜索引擎入门最佳实践(一)_flame.liu的博客-CSDN博客 ES搜索引擎入门最佳实践(二)_flame.liu的博客-CSDN博客 ES搜索引擎入门最佳实践(三)_flame.liu的博客-CSDN博客 ES搜索引擎入门最佳实践(四)_flame.liu的博…...
android内存分析工具记录,请利用好最后2个神器
相机见证了java内存暴增和native持续增长的问题,因此这里记录一下使用的工具情况,方便后续继续使用 一、java 内存 如果是java层的内存可以直接借助leakCanary工具,配置也很简单,直接在build.gradle中添加依赖即可: …...
安科瑞变电所运维平台在电力系统中应用分析
摘要:现代居民生活、工作对电力资源的需求量相对较多,给我国的电力产业带来了良好的发展机遇与挑战。探索电力系统基本构成, 将变电运维安全管理以及相应的设备维护工作系统性开展,能够根据项目实践工作要求,将满足要求…...
uniapp开发微信小程序使用painter将页面转换为图片并保存到本地相册
引言 我使用到painter的原因是,在uniapp开发微信小程序时,需要将一个页面的内容转换成图片保存到本地相册。 起初在网上找到很多都是在uniapp中使用 html2canvas 将网页转换成图片再jspdf将图片转换为pdf,但是这种方式在小程序环境不支持&am…...
790. 数的三次方根
文章目录 QuestionIdeasCode Question 给定一个浮点数 n ,求它的三次方根。 输入格式 共一行,包含一个浮点数 n 。 输出格式 共一行,包含一个浮点数,表示问题的解。 注意,结果保留 6 位小数。 数据范围 −10000≤…...
POSTGRESQL 关于2023-08-14 数据库自动启动文章中使用KILL 来进行配置RELOAD的问题解释...
开头还是介绍一下群,如果感兴趣Polardb ,mongodb ,MySQL ,Postgresql ,redis ,SQL SERVER ,ORACLE,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加 liuaustin3微信号 &…...
vue 使用插件高德地图--vue-amap
第一步:安装 vue-amap npm install vue-amap第二步:在你的 Vue 项目中注册 vue-amap: // main.js import Vue from vue; import VueAMap from vue-amap;Vue.use(VueAMap);VueAMap.initAMapApiLoader({// 高德开发者平台申请key值key: cc9c098…...
减速比如何计算
减速比是用来衡量机械系统中输入轴和输出轴转速之间的比例关系,通常用来描述传动装置(如齿轮传动、皮带传动等)的效果。计算减速比的公式取决于传动装置的类型。以下是一些常见传动装置的减速比计算方法: 齿轮传动: 对…...
HarmonyOS/OpenHarmony应用开发-ArkTSAPI组件总体分类与说明(下)
六、文本与输入 Text 显示一段文本的组件。 Span 作为Text组件的子组件,用于显示行内文本片段的组件。 Search 搜索框组件,适用于浏览器的搜索内容输入框等应用场景。 TextArea 多行文本输入框组件,当输入的文本内容超过组件宽度时会自动换行…...
势函数和鞅的停时定理
前置芝士 鞅: 鞅是一类特殊的随机过程,假设我们从一开始就在观察一场赌博游戏,现在已经得到了前t秒的观测值,那么当第t1 秒观测值的期望等于第t秒的观测值时,我们称这是一个公平赌博游戏。 具体来说,对于…...
途乐证券-炒股开户流程是怎样的?
炒股是一种危险较大但收益也相对较高的出资方法,而开户则是出资炒股的前提。跟着科技的开展,炒股开户已经能够在线完结,但流程相对来说仍是比较繁琐的。那么,炒股开户流程是怎样的呢?下面从多个视点剖析。 一、炒股开户…...
Eclipse如何设置快捷键
在eclopse设置注释行和取消注释行 // 打开eclipse,依次打开:Window -> Preferences -> General -> Key,...
刷享全球美好 中信银行信用卡推出跨境消费系列活动
来源 | 镭射财经(leishecaijing) 日前,文旅部办公厅发布通知,恢复全国旅行社及在线旅游企业经营中国公民赴有关国家和地区(第三批)出境团队旅游和“机票酒店”业务,出境跟团游国家和地区由此前…...
LeetCode算法心得——限制条件下元素之间的最小绝对差(TreeSet)
大家好,我是晴天学长,今天用到了Java一个非常实用的类TreeSet,能解决一些看起来棘手的问题。 1 )限制条件下元素之间的最小绝对差 2) .算法思路 初始化变量:n为列表nums的大小。 min为整型最大值,用于记录…...
MySQL表的基础操作(crud)
1. 新增(Create) insert into 表名 values (值, 值…); 此处列出的这些值,的数目和类型要和表的列相匹配。 -- 在student 表中插入学号1,姓名zhangsan的数据 insert into student values(1, zhangsan); -- 指定列插入 insert into student …...
玩转ESP32-S3调试:GDB高级命令与自定义调试技巧大全
玩转ESP32-S3调试:GDB高级命令与自定义调试技巧大全 调试嵌入式系统时,GDB的强大功能往往被低估。对于ESP32-S3开发者来说,掌握GDB的高级调试技巧可以显著提升解决复杂问题的效率。本文将深入探讨如何利用GDB的watch命令、自定义命令、跳转执…...
ftools架构深度解析:Stata大数据处理的技术革命
ftools架构深度解析:Stata大数据处理的技术革命 【免费下载链接】ftools Fast Stata commands for large datasets 项目地址: https://gitcode.com/gh_mirrors/ft/ftools 在数据科学和经济学研究的实践中,Stata用户经常面临一个共同的挑战&#x…...
视频修复终极指南:如何用UNTRUNC拯救你的损坏视频文件
视频修复终极指南:如何用UNTRUNC拯救你的损坏视频文件 【免费下载链接】untrunc Restore a damaged (truncated) mp4, m4v, mov, 3gp video. Provided you have a similar not broken video. 项目地址: https://gitcode.com/gh_mirrors/unt/untrunc 还记得那…...
基于STM32F与ESP8266的智能桌面天气时钟:从网络授时到OLED显示的完整实现
1. 项目背景与核心功能 最近在工作室捣鼓了一个特别实用的小玩意儿——用STM32F和ESP8266做的智能桌面天气时钟。这可不是普通的电子钟,它能自动联网校准时间,还能实时显示当地天气,放在书桌上既美观又实用。很多朋友看到后都问我是怎么做的&…...
离线语音智能处理平台Buzz:本地化音频转文本全攻略
离线语音智能处理平台Buzz:本地化音频转文本全攻略 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz 在当今信息驱动…...
【T型三电平仿真】SPWM调制中的单双极性载波特性对比
1. T型三电平逆变器基础认知 第一次接触T型三电平拓扑时,我被它精巧的结构设计惊艳到了。与传统的两电平逆变器相比,这种拓扑在每相桥臂上增加了两个钳位开关管,形成了独特的"T"字形结构。实际搭建电路时,你会发现它的输…...
Windows系统效能优化指南:基于Win11Debloat的系统调校方案
Windows系统效能优化指南:基于Win11Debloat的系统调校方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter an…...
高效媒体下载全平台解决方案:跨平台资源获取工具深度指南
高效媒体下载全平台解决方案:跨平台资源获取工具深度指南 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …...
intv_ai_mk11应用场景:新媒体运营——热点事件评论草稿、标题党生成、互动话术
intv_ai_mk11在新媒体运营中的三大实战应用 1. 新媒体运营的痛点与AI解决方案 新媒体运营人员每天面临三大核心挑战:快速跟进热点事件、创作吸引眼球的标题、设计有效的互动话术。传统人工创作方式不仅耗时耗力,而且难以保证持续高质量输出。 intv_ai…...
颠覆式突破:多模态模型的3大技术跃迁与跨模态理解革命
颠覆式突破:多模态模型的3大技术跃迁与跨模态理解革命 【免费下载链接】Emu3 Next-Token Prediction is All You Need 项目地址: https://gitcode.com/gh_mirrors/em/Emu3 多模态模型作为人工智能领域的前沿方向,正在深刻改变机器理解世界的方式。…...
