C++设计模式——Flyweight享元模式
一,享元模式简介
二,享元模式的结构
代码实现:
#include <iostream>
#include <memory>
#include<unordered_map>using namespace std;class Flyweight {
protected:int id; //内部状态public:Flyweight(int id) : id(id) {}virtual void operation() const = 0;
};class ConcreteFlyweightA : public Flyweight {
public:ConcreteFlyweightA() : Flyweight(1) {}void operation() const override {cout << "Concrete Flyweight A, id: " << id << endl;}
};class ConcreteFlyweightB : public Flyweight {
public:ConcreteFlyweightB() : Flyweight(2) {}void operation() const override {cout << "Concrete Flyweight B, id: " << id << endl;}
};// 定义享元工厂
class FlyweightFactory {
private:std::unordered_map<int, shared_ptr<Flyweight>> flyweights;public:FlyweightFactory() {}//返回享元对象std::shared_ptr<Flyweight> getConcreteFlyweight(int id) {if (flyweights.find(id) == flyweights.end()) {if (id % 2 == 0) {flyweights[id] = make_shared<ConcreteFlyweightA>();}else {flyweights[id] = make_shared<ConcreteFlyweightB>();}}return flyweights[id];}
};int main() {FlyweightFactory factory;shared_ptr<Flyweight> f1 = factory.getConcreteFlyweight(1);shared_ptr<Flyweight> f2 = factory.getConcreteFlyweight(2);shared_ptr<Flyweight> f3 = factory.getConcreteFlyweight(3);f1->operation();f2->operation();f3->operation();return 0;
}
运行结果:
Concrete Flyweight B, id: 2
Concrete Flyweight A, id: 1
Concrete Flyweight B, id: 2
三,享元模式的工作步骤
四,享元模式的应用场景
五,享元模式的优缺点
六,代码实战
#include <iostream>
#include <map>using namespace std;//Flyweight
class Character {
public:Character(char symbol) : symbol_(symbol) {}Character() = default;void print() const {cout << "Character: " << symbol_ << endl;}private:char symbol_;
};//Flyweight factory
class CharacterFactory {
public:static const Character& getCharacter(char symbol) {if (characters_.find(symbol) == characters_.end()) {characters_[symbol] = Character(symbol);cout << "Create new char." << endl;}return characters_[symbol];}private:static map<char, Character> characters_;
};map<char, Character> CharacterFactory::characters_;int main() {const Character& A = CharacterFactory::getCharacter('A');const Character& B = CharacterFactory::getCharacter('B');//Reusing 'A'const Character& A2 = CharacterFactory::getCharacter('A');A.print();B.print();A2.print();return 0;
}
运行结果:
Create new char.
Create new char.
Character: A
Character: B
Character: A
七,参考阅读
相关文章:
![](https://img-blog.csdnimg.cn/direct/19ff5136621a434fa3541f01878b6641.png)
C++设计模式——Flyweight享元模式
一,享元模式简介 享元模式是一种结构型设计模式,它将每个对象中各自保存一份数据的方式改为多个对象共享同一份数据,该模式可以有效减少应用程序的内存占用。 享元模式的核心思想是共享和复用,通过设置共享资源来避免创建过多的实…...
![](https://www.ngui.cc/images/no-images.jpg)
Github 2024-06-19 开源项目日报 Top10
根据Github Trendings的统计,今日(2024-06-19统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目3Rust项目2Go项目2JavaScript项目1Python项目1Dart项目1非开发语言项目1Ruby项目1HTML项目1项目化学习 创建周期:2538 天协议类…...
![](https://img-blog.csdnimg.cn/direct/25d75324150a4df89301f411eb6a7762.png)
【ARM】如何通过Keil MDK查看芯片的硬件信息
【更多软件使用问题请点击亿道电子官方网站】 1、文档目标: 解决在开发过程中对于开发项目所使用的的芯片的参数查看的问题 2、问题场景: 在项目开发过程中,经常需要对于芯片的时钟、寄存器或者一些硬件参数需要进行确认。大多数情况下是需…...
![](https://img-blog.csdnimg.cn/direct/4d423454a0984e4e9e0d9cb1c0a4a780.png)
elasticsearch的安装和配置
单节点安装与部署 我们通过docker进行安装 1.docker的安装 如果以及安装了docker就可以跳过这个步骤。 首先更新yum: yum update安装docker: yum install docker查看docker的版本: docker -v此时我们的docker就安装成功了。 2.创建网络 我们还需要部署kiban…...
![](https://img-blog.csdnimg.cn/direct/3256303c731f49f6a8ac46e62194fb9f.png)
华为云下Ubuntu20.04中Docker的部署
我想用Docker拉取splash,Docker目前已经无法使用(镜像都在国外)。这导致了 docker pull 命令的失败,原因是timeout。所以我们有必要将docker的源设置在国内,直接用国内的镜像。 1.在华为云下的Ubuntu20.04因为源的原因…...
![](https://www.ngui.cc/images/no-images.jpg)
1、C++编程中的基本运算 - 课件
一、基础知识 1、C程序的基本框架 // 预处理器指令,引入需要的头文件 #include <iostream> // 使用标准命名空间 using namespace std; // 主函数,程序的入口 int main() {// 局部变量声明// 程序逻辑代码// 返回值,表示程序正常结束…...
![](https://www.ngui.cc/images/no-images.jpg)
Java动态代理详解
文章目录 一、JDK动态代理1、关键类和接口2、实现步骤 二、CGLIB动态代理1、关键类2、实现步骤 三、总结 Java中的动态代理是一种设计模式,它允许在运行时创建代理对象,而不是在编译时。代理对象可以用来代理真实对象的方法调用。 Java中的动态代理主要…...
![](https://www.ngui.cc/images/no-images.jpg)
Python基础学习文档
一、Python入门 1.Python简介: Python是一种高级编程语言,用于多种应用,包括网站开发、数据科学、人工智能等。 Python具有语法简洁、易读性强、功能强大等特点。 2.安装Python ①访问Python官网(https://www.python.org/&am…...
![](https://img-blog.csdnimg.cn/direct/672f2cee071143718d8748dfb52ed408.jpeg)
数据结构与算法笔记:基础篇 - 分治算法:谈一谈大规模计算框架MapReduce中的分治思想
概述 MapReduce 是 Google 大数据处理的三姐马车之一,另外两个事 GFS 和 Bigtable。它在倒排索引、PageRank 计算、网页分析等搜索引擎相关的技术中都有大量的应用。 尽管开发一个 MapReduce 看起来很高深。实际上,万变不离其宗,它的本质就…...
![](https://img-blog.csdnimg.cn/direct/f9ae5081eb384691b6c9ca5ef0484f3d.png)
如何清除anaconda3缓存?
如果长期使用anaconda不清理缓存,会导致anaconda占用磁盘空间越来越多,甚至系统磁盘撑爆。 清除包缓存: 打开 Anaconda Prompt 或者命令行窗口。运行以下命令清除包缓存:conda clean --all这会清除所有的包缓存,释放磁…...
![](https://img-blog.csdnimg.cn/img_convert/6d2fadf913666ab5957cdc062740853f.jpeg)
智慧校园发展趋势:2024年及未来教育科技展望
展望2024年及未来的教育科技领域,智慧校园的发展正引领着一场教育模式的深刻变革,其核心在于更深层次地融合技术与教育实践。随着人工智能技术的不断成熟,个性化学习将不再停留于表面,而是深入到每个学生的个性化需求之中。通过精…...
![](https://img-blog.csdnimg.cn/img_convert/9210a8afc87b7a5e9a554fd668423d7b.png)
【Python机器学习系列】针对特定数据构建管道流水线进行机器学习预测(案例+源码)
这是我的第305篇原创文章。 一、引言 机器学习项目中有可以自动化的标准工作流程。在 Python scikit-learn 中,管道有助于明确定义和自动化这些工作流程。使用pipeline后,我们每一步的输出都会自动的作为下一个的输入。一套完整的机器学习应用流程如下&a…...
![](https://www.ngui.cc/images/no-images.jpg)
Python 学习 第三册 第12章 图的最优化问题
----用教授的方式学习。 目录 12.1图的最优化问题 12.1.1最短路径:深度优先搜索和广度优先搜索 12.1图的最优化问题 我们下面研究另一种最优化问题。假设你有一个航空公司航线的价格列表,其中包括美国任意两个城市之间的航班价格。假设有3个城市A、B和C,从A出发经过B到达…...
![](https://www.ngui.cc/images/no-images.jpg)
建筑工程乙级资质与工程质量控制体系的构建
1. 质量管理体系建立 ISO 9001认证:虽然不是直接要求,但许多乙级资质企业会选择通过ISO 9001质量管理体系认证,以标准化管理流程,提升质量管理水平。质量方针与目标:明确企业的质量方针,设定可量化、可追踪…...
![](https://img-blog.csdnimg.cn/direct/2ede13d7e91d4983912ffad1b0e7bb4f.png)
kafka学习笔记07
Kafka高可用集群搭建节点需求规划 开放端口。 Kafka高可用集群之zookeeper集群搭建环境准备 删除之前的kafka和zookeeper。 重新进行环境部署: 我们解压我们的zookeeper: 编辑第一个zookeeper的配置文件: 我们重复类似的操作,创建三个zookeeper节点: 记…...
![](https://img-blog.csdnimg.cn/direct/85d927d7e8ef48cca9f0f4f81d9b87f4.png)
MQTTfx连接阿里云(详细版)
1、介绍 作为物联网开放平台,阿里云可谓是吸引大多数嵌入式爱好者的平台。物联网MQTT协议火热的今天,你使用过阿里云吗?本篇文章带你接触阿里云,实现MQTT通信。 我们在测试MQTT之前先了解下什么是MQTT协议。大家都知道它是一种发…...
![](https://www.ngui.cc/images/no-images.jpg)
Vue3使用provide和inject实现孙组件给爷组件传递数据
前言: 最近在研究gitHub中的一个项目并将与自己之前完成的项目进行结合,其中有一个功能是需要在孙组件将数据传递给爷组件,笔者研究后将使用总结如下: 具体步骤: 1.爷组件先定义一个空的函数传递给孙子 2.孙组件使…...
![](https://img-blog.csdnimg.cn/direct/0ef8169e78744fe0b05f2c3c30e58161.png)
昇思25天学习打卡营第1天|基本介绍及快速入门
1.第一天学习总体复盘 1)成功注册昇思大模型平台,并成功申请算力; 2)在jupyter环境下学习初学入门/初学教程的内容; 在基本介绍部分,快速撸了一边内容,有了一个基本的了解(没理解到位的计划采用…...
![](https://img-blog.csdnimg.cn/img_convert/e477755b81b13c9fa33a2e8414cedcb1.png)
C#.Net筑基-类型系统②常见类型
01、结构体类型Struct 结构体 struct 是一种用户自定义的值类型,常用于定义一些简单(轻量)的数据结构。对于一些局部使用的数据结构,优先使用结构体,效率要高很多。 可以有构造函数,也可以没有。因此初始…...
![](https://www.ngui.cc/images/no-images.jpg)
【人机交互 复习】第5章 交互式系统的需求
产品特性和用户个体差异引起的不同需求。 一、产品特性 1.功能不同 (1)智能冰箱:应能够提示黄油已用完 (2)字处理器:系统应支持多种格式 2.物理条件不同 (1)移动设备运行的系统应尽…...
![](https://img-blog.csdnimg.cn/direct/ea6375ce86ff460197dc8e7cf08dea8e.png)
知识的补充
目录 电容和电感的基本性质 高频电路中电容与电感的等效电路 阻抗与导纳 常用单位转换 电容和电感的基本性质 电容C是两个平板比较直,i也比较直,C的 i 随 u 的变化率变化,i 的相位超前。 电感L是个线圈比较弯曲,u也比较弯&…...
![](https://www.ngui.cc/images/no-images.jpg)
微信小程序请求服务器报ERR_CONNECTION_RESET
排查思路 1.域名是否配置或跳过 2.域名是否备案 3.证书是否有效 4.服务器中间件配置证书是否生效 5.服务器中间件转发配置是否生效 6.接口是否正常 本人遇到问题描述,通过浏览器访问本人网站,https,get请求可以通,小程序wx…...
![](https://www.ngui.cc/images/no-images.jpg)
SpringMVC:拦截Mybatis的mapper
我们在使用mybatis的时候会碰到一些公共添加时间,操作人员,更新时间、或者一些分页这个使我们如果要去添加每个对应的- service - dao - mapper - xml 这样就造成很多冗余代码,那这个时候我们就需要使用一些通用方法,统一就行修改…...
![](https://www.ngui.cc/images/no-images.jpg)
MySQL查询性能优化解决方案
解决方案 主键与默认常用查询字段建立索引,普通字段类型选择 UNIQUE,索引方法 BTREE ;长文本使用 FULLTEXT,索引方法为无; 新建表时引擎默认设置为 MyISAM,不使用 InnoDB,因为 MyISAM 支持 MAT…...
![](https://img-blog.csdnimg.cn/direct/e6c7d0baecd14663bff6a8608ad0d384.png)
系统安全(补充)
拒绝服务漏洞(拒绝服务漏洞将导致网络设备停止服务,危害网络服务可用性)旁路(旁路漏洞绕过网络设备的安全机制,使得安全措施没有效果)代码执行(该类漏洞使得攻击者可以控制网络设备,…...
![](https://img-blog.csdnimg.cn/img_convert/740d903ba43189277d5eefb9a2568718.png)
腾讯云[HiFlow】| 自动化 -------HiFlow:还在复制粘贴?
文章目录 前言:一:HiFlow是什么二:功能介绍1.全连接2.自动化2.1定时处理特定任务2.2实时同步变更信息2.3及时获取通知提醒 3.零代码4.多场景5.可信赖 三:用户体验最后 前言: 随着网络时代的不断发展,自动化…...
![](https://img-blog.csdnimg.cn/direct/7fed6462391d484eaa790daeccf92e55.png)
音视频入门基础:H.264专题(3)——EBSP, RBSP和SODB
音视频入门基础:H.264专题系列文章: 音视频入门基础:H.264专题(1)——H.264官方文档下载 音视频入门基础:H.264专题(2)——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…...
![](https://img-blog.csdnimg.cn/direct/9af9d49cc5d641d98fbe539ffc9e46b3.png)
误删群晖NAS数据有什么找回的方法?
1、使用群晖 NAS 自带的备份功能:如果您之前启用了群晖的备份计划,例如 Hyper Backup 或 Snapshot Replication,您可以从备份中恢复数据。 1.1、Hyper Backup 可以将数据备份到多种目的地,包括本地存储、外部硬盘、其他 NAS 设备等…...
![](https://img-blog.csdnimg.cn/direct/1955cff865c54056b0a69d3573661e67.png)
【CRASH】freelist异常导致的异常地址访问
freelist异常导致的异常地址访问 问题现象初步分析继续深入新的发现沙盘推演寻找元凶分析代码后记 问题现象 项目一台设备几天内出现了两次crash,都是异常地址访问导致。 [66005.261660] BUG: unable to handle page fault for address: ffffff8881575110初步分析…...
![](https://www.ngui.cc/images/no-images.jpg)
【QT】C++ || 左值引用、右值引用、移动语义、完美转发
在C中,左右值引用是高级语言特性,用于更高效的内存和资源管理。了解左右值引用的概念对于编写高效的C代码非常重要。下面解释左右值引用的概念、用途和区别,并通过示例来说明它们的使用。 左值引用(Lvalue Reference)…...
![](http://www.gameres.com/data/attachment/forum/201509/07/140033jpyteejzuz5zcynt.jpg)
网站建设规划图/标题关键词优化报价
GameRes游资网授权发布 文 / 张锋 属性的价值应该如何评估?一些属性远较,又彼此没有关联的属性应该如何衡量其价值? 100点物理攻击力和5%的暴击应该如何取舍?让我们带着这个问题来探讨“属性的价值体系” 有效生命 有…...
南通网站建设费用/温州seo按天扣费
前两天成都出了太阳,本以为寒潮就此过去。结果今天又冷风呼呼吹,缩在家看书。手机震了一下,是微信有新的提醒,打开一看是 「小道消息」推送了一篇《学计算机的同学们啊,想清楚再去读研究生》,读完感觉一下击…...
![](/images/no-images.jpg)
改变网站字体/百度空间登录
Lucene的概述: Lucene(发音为 [lusen] )是一个非常优秀的开源的全文搜索引擎,我们可以在它的上面开发出各种全文搜索的应用来。Lucene在国外有很高的知名度,现在已经是Apache的顶级项目,在国内,Lucene的应用也越来越多。 Lucene的…...
![](/images/no-images.jpg)
wordpress 繁体/营销方式和营销策略
关于事件 在我们使用javascript开发时,我们会经常用到很多事件,如点击、键盘、鼠标等等,这些物理性的事件。而我们今天所说的我称之为事件的,是另一种形式的事件,订阅---发布,又叫做观察者模式,…...
![](/images/no-images.jpg)
东坝地区网站建设/近两年成功的网络营销案例
Context提供了一种跨组件访问数据的方法。它无需在组件树间逐层传递属性,也可以方便的访问其他组件的数据 在经典的React应用中,数据是父组件通过props向子组件传递的。但是在某些特定场合,有些数据需要在各个组件之间共享。 Context 为我们…...
![](https://img-blog.csdnimg.cn/img_convert/fc0291a3144e52cbd2ea713c34f333bf.png)
营销网站做推广/网站推广策划书范文
Excel2007是我们日常工作和学习的时候常常会用到的软件,而精彩会需要使用到散点图,并为散点图设置标签,可是许多win7系统用户并不知道excel2007散点图如何添加文字标签吧,下面就给大家分享一下具体的操作步骤供大家分享。推荐&…...