享元模式-C++实现

享元模式(FlyWeight Pattern)是一种结构型设计模式,旨在减少对象创建的数量,节省内存和提高性能。

在某些情况下,一个项目里可能需要创建大量相似的对象,这样对象的一部分是共享的(相同的),还有一部分是个性化(不同的)。享元模式通过共享相同数据的方式,减少了对象的创建,从而减少了内存的占用。

举例:
比如说在一个文本编辑器里,需要大量相同的文本内容,但是相同的文本内容又有一些区别,比如字体大小、字体颜色。这种时候就可以使用享元模式创建大量的相似对象,节省内存和提高性能。

在这个例子中,文本内容减少共享数据,字体大小、字体颜色就是个性化定制,也就是外部数据。

享元模式有两个角色:对象、创建对象的工厂。

#pragma once#include <iostream>
#include <memory>
#include <string>
#include <unordered_map>// 文本对象
class Text
{
public:Text(const std::string& _content): content_(_content){}// 获取文本内容void GetContent(){std::cout << color_ << "的" << content_ << std::endl;}// 个性化定制 设置文本内容的颜色void SetContentColor(const std::string& _color){color_ = _color;}private:std::string content_;std::string color_;
};// 文本工厂
class TextFactory
{
public:static std::shared_ptr<Text> GetText(const std::string& _text){if (text_pool_.find(_text) == text_pool_.end())text_pool_[_text] = std::make_shared<Text>(_text);return text_pool_[_text];}private:static std::unordered_map<std::string, std::shared_ptr<Text>> text_pool_;
};std::unordered_map<std::string, std::shared_ptr<Text>> TextFactory::text_pool_;

测试:

void TestFlyWeight()
{// 创建工厂std::shared_ptr<TextFactory> text_factory = std::make_shared<TextFactory>();// 创建文本对象std::shared_ptr<Text> text1 = text_factory->GetText("hello");// 个性化定制text1->SetContentColor("红色");// 使用text1->GetContent();std::shared_ptr<Text> text2 = text_factory->GetText("world");text2->SetContentColor("绿色");text2->GetContent();std::shared_ptr<Text> text3 = text_factory->GetText("hello");text3->SetContentColor("黄色");text3->GetContent();// 检查文本对象是否相同std::cout << std::boolalpha;std::cout << (text1 == text2) << std::endl;  // falsestd::cout << (text1 == text3) << std::endl;  // true
}

输出:

红色的hello
绿色的world
黄色的hello
false
true

我们可以看到text1和text2是同一个对象,但是通过个性化定制我们就可以使用不同颜色的相同文本内容。

文本工厂其实可以写成单例模式,这样我们不管在什么时候获取到文本对象都是同一个对象。

优点:

1、减少内存使用:通过共享相似对象的相同内部状态来减少内存消耗,相同的对象在内存中只创建一次,通过共享来重用。

2、提高性能:由于重复的对象被共享,可以减少创建和销毁对象的开销,提高性能。

缺点:

1、共享状态的限制:由于具有相同内部状态的对象是共享的,所以一个对象修改了自己的外部状态之后,会影响到其他的共享对象。比如上述例子中我们把text1的颜色设置黄色,如果我们不设置text3的颜色,则它的颜色也是黄色。

2、引入共享管理:由于享元模式引入了共享对象的管理机制,就需要创建一个享元工厂或缓存来管理共享对象的创建和存取,增加了系统的复杂性。

3、某些情况下的性能问题:当需要频繁地创建和销毁共享对象时,或者共享对象的数量非常庞大时,共享对象管理的开销可能会超过由于共享而节约的时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/178612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基础-中级-高级面试题汇(一)

第一部分&#xff1a; Java基础面试题汇总 1.面向对象和面向过程的区别&#xff1f; 面向对象和面向过程是两种不同的编程思想。面向对象是一种以对象为中心的编程思想&#xff0c;将数据和处理数据的方法封装在一起&#xff0c;形成一个类。程序通过创建对象来调用类中的方法…

静态住宅IP代理实际应用:它的强大用途你知道吗?

静态住宅IP代理与动态IP代理相比&#xff0c;提供了更稳定的网络身份&#xff0c;使得企业在进行数据采集、区域定位营销和市场研究时更为高效。同时&#xff0c;它也是提高在线隐私保护和避免封禁的有效工具。 通过详细分析&#xff0c;你将能全面了解静态住宅IP代理的应用&a…

SAP_ABAP_编程基础_字符转换_内存表、jsonString 相互转换

SAP ABAP 顾问&#xff08;开发工程师&#xff09;能力模型_Terry谈企业数字化的博客-CSDN博客文章浏览阅读441次。目标&#xff1a;基于对SAP abap 顾问能力模型的梳理&#xff0c;给一年左右经验的abaper 快速成长为三年经验提供超级燃料&#xff01;https://blog.csdn.net/j…

【力扣:1707 1803】0-1字典树

思路&#xff1a;树上每个节点存储拥有该节点的数组元素的最小值&#xff0c;left节点表示0&#xff0c;right节点表示1&#xff0c;构建完成后遍历树当子节点没有比mi小的元素时直接输出-1&#xff0c;否则向下构造。 struct tree{int m;tree*leftnullptr,*rightnullptr;tree…

【传智杯】儒略历、评委打分、萝卜数据库题解

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; 蓝桥杯 &#x1f319;请不要相信胜利就像山坡上的蒲公英一样唾手…

人工智能在现代科技中的应用和未来发展趋势-AI生成

人工智能&#xff08;AI&#xff09;是一种计算机科学技术&#xff0c;它为计算机系统赋予了类似人类思维和学习能力的功能。人工智能在现代科技中的应用越来越广泛&#xff0c;从智能手机到智能家居、自动驾驶汽车、医疗诊断、金融交易、机器人等众多领域都可以看到人工智能的…

精调llama模型

github地址&#xff1a;https://github.com/facebookresearch/llama-recipes github:https://github.com/facebookresearch/llama import torch from transformers import LlamaForCausalLM, LlamaTokenizer#model_id"./models_hf/7B" # 可以从huggingface上面下载模…

pandas教程:2012 Federal Election Commission Database 2012联邦选举委员会数据库

文章目录 14.5 2012 Federal Election Commission Database&#xff08;2012联邦选举委员会数据库&#xff09;1 Donation Statistics by Occupation and Employer&#xff08;按职业与雇主划分的捐赠数据&#xff09;2 Bucketing Donation Amounts&#xff08;桶捐赠额&#x…

vue项目实战-电商后台管理系统

项目简介&#xff1a; 该项目为电商后台的管理系统。设计了登录页面。 管理人员需要通过输入正确的用户名和密码才能登录。登陆成功之后进入管理页面&#xff1a; 管理页面由五个子模块组成&#xff1a;用户管理&#xff0c;权限管理&#xff0c;商品管理&#xff0c;订单管理…

实验八-数据处理

目录 1.数据来源 2.对于All表&#xff1a; 3.对于sf 和sfweibo 表&#xff1a; 4. 对于base_info表&#xff1a; 5.导出最后结果到一个Excel文件中&#xff0c;完成数据处理。 1.数据来源 本次所分析的数据是通过爬虫抓取的微博数据。选取新浪微博为数据平台&#xff0c;选…

electron打包 Error output: !include: could not find:

Error output: 2 !include: could not find: "C:\Users\xxxx(这里是中文)\AppData\Local\Temp\t-TH3KzB\0-messages.nsh" 3 Error in script "<stdin>" on line 75 -- aborting creation process这个报错意思是路径有中文存在&#xff0c;解析不到&a…

STM32CubeIDE(ADC)

学习链接&#xff1a;【HAL库详解】STM32 ADC HAL库使用_哔哩哔哩_bilibili 目录 一、概念 1、ADC介绍 2、ADC主要特征 二、ADC模式 1、查询模式 1.1 单通道采集软件配置 1.2 查询模式步奏 1.3 单通道采集主要代码 2、多通道采集 2.1 软件配置 2.2 主要代码 一、概…

【Linux】Linux第一个小程序 --- 进度条

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和Linux还有算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 …

RBAC(Role-Based Access Control,基于角色的访问控制)

1. RBAC核心概念 RBAC&#xff08;Role-Based Access Control&#xff0c;基于角色的访问控制&#xff09;是一种广泛应用于软件和系统中的权限管理模型。它通过将用户与角色关联&#xff0c;再将角色与访问权限关联&#xff0c;来管理用户对系统资源的访问。RBAC模型的主要特…

电子学会C/C++编程等级考试2022年06月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:制作蛋糕 小A擅长制作香蕉蛋糕和巧克力蛋糕。制作一个香蕉蛋糕需要2个单位的香蕉,250个单位的面粉,75个单位的糖,100个单位的黄油。制作一个巧克力蛋糕需要75个单位的可可粉,200个单位的面粉,150个单位的糖,150个单位的黄…

jenkins 代码执行 (CVE-2017-1000353)漏洞复现

jenkins 代码执行 (CVE-2017-1000353)漏洞复现 名称: jenkins 代码执行 &#xff08;CVE-2017-1000353&#xff09; 描述: ​Jenkins 可以通过其网页界面轻松设置和配置,其中包括即时错误检查和内置帮助。 插件 通过更新中心中的 1000 多个插件,Jenkins 集成了持续集成和持续…

【C++初阶(九)】 priority_queue的使用与模拟实现

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…

删除链表的倒数第N个节点,剑指offerII(21),力扣

目录 题目地址&#xff1a; 题目&#xff1a; 相似类型题&#xff1a; 我们直接看本题题解吧&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 解题分析&#xff1a; 解题思路&#xff08;双指针&#xff09;&#xff1a; 代码实现&#xff1a; 代码说明&#xff1a; 代…

C++基础 -8- 函数重载

函数重载格式(图片代码段呈现) #include "iostream"using namespace std;void rlxy(int a) {cout << "int a"<< endl; }void rlxy(char a) {cout << "char a"<< endl; }int main() {rlxy(99);rlxy(c); }函数重载的依据…

从Android面试题目溯源-1、创建线程有那几种方式

概念 程序执行流的最小单位&#xff0c;处理器调度调度和分派的基本单位。 如何理解这个概念 如下图&#xff0c;可以简单类比吉他&#xff0c;六根弦代表六个线程&#xff0c;每个线程独立且单独运行&#xff0c;且持有上一个音的状态&#xff0c;每根手指可类比为一个CPU的…