当前位置: 首页 > news >正文

篇十一:享元模式:共享细粒度对象

篇十一:“享元模式:共享细粒度对象”

设计模式是软件开发中的重要工具,享元模式(Flyweight Pattern)是结构型设计模式的一种。享元模式旨在通过共享细粒度的对象,减少内存消耗和提高性能。在设计模式学习中,享元模式是一个重要的概念。本文将介绍享元模式的原理和优点,并提供C++实现享元模式的示例代码。

开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。

另外有2本不错的关于设计模式的资料,分享出来与大家学习参考。
链接:https://pan.baidu.com/s/1RmhQF_o1CdK8U7s5KeILog?pwd=xc6d
提取码:xc6d

1. 享元模式的原理:
享元模式是一种结构型设计模式,其核心思想是通过共享细粒度的对象,减少内存消耗和提高性能。在软件开发中,有些对象可能会重复创建,造成内存资源的浪费。享元模式通过维护一个对象池来管理这些细粒度的对象,当需要创建对象时,先从对象池中查找是否已经存在该对象,如果存在则直接返回,如果不存在则创建新的对象并加入对象池中。

享元模式中有两种对象:内部状态和外部状态。内部状态是可以共享的,不会随着外部环境的改变而改变;而外部状态是随着外部环境的改变而改变的,每个对象都有不同的外部状态。

2. 享元模式的优点:

  • 减少内存消耗:通过共享细粒度的对象,减少了内存的消耗,提高了系统的性能。
  • 提高性能:共享对象减少了对象的创建和销毁过程,提高了系统的性能。
  • 支持大量细粒度对象:享元模式适用于大量细粒度对象的场景,将对象的内部状态共享,节省了内存空间。

3. 在C++中使用享元模式:

a. 定义享元类:

// Flyweight.h
#include <string>class Flyweight {
public:virtual ~Flyweight() {}virtual void operation(const std::string& extrinsicState) const = 0;
};

b. 创建具体享元类:

// ConcreteFlyweight.h
#include "Flyweight.h"
#include <iostream>class ConcreteFlyweight : public Flyweight {
public:void operation(const std::string& extrinsicState) const override {std::cout << "Concrete Flyweight with extrinsic state: " << extrinsicState << std::endl;}
};

c. 创建享元工厂类:

// FlyweightFactory.h
#include "Flyweight.h"
#include <unordered_map>class FlyweightFactory {
public:Flyweight* getFlyweight(const std::string& key) {if (flyweights_.find(key) == flyweights_.end()) {flyweights_[key] = new ConcreteFlyweight();}return flyweights_[key];}private:std::unordered_map<std::string, Flyweight*> flyweights_;
};

d. 使用享元模式:

// main.cpp
#include "Flyweight.h"
#include "ConcreteFlyweight.h"
#include "FlyweightFactory.h"int main() {FlyweightFactory factory;Flyweight* flyweight1 = factory.getFlyweight("shared");flyweight1->operation("state1");Flyweight* flyweight2 = factory.getFlyweight("shared");flyweight2->operation("state2");return 0;
}

在上述示例中,我们首先定义了享元类Flyweight,其中包含了操作的抽象接口operation()。然后,我们创建了具体享元类ConcreteFlyweight,实现了operation()接口,表示可以共享的细粒度对象。接着,我们创建了享元工厂类FlyweightFactory,用于管理享元对象的创建和共享。

main.cpp中,我们创建了享元工厂的实例factory,通过调用factory.getFlyweight()方法来获取享元对象。当需要创建对象时,首先查找是否已经存在相应的享元对象,如果存在则直接返回,如果不存在则创建新的对象。最后,我们调用flyweight1->operation()flyweight2->operation()来演示享元对象的使用。

4. 享元模式的代码解析:

  • 享元模式通过共享细粒度的对象,减少内存消耗和提高性能。
  • 共享对象分为内部状态和外部状态,内部状态是可以共享的,不随外部环境变化而变化;外部状态是随外部环境变化而变化的,每个对象都有不同的外部状态。
  • 享元模式适用于大量细粒度对象的场景,通过维护一个对象池来管理共享对象。

5. 总结:
享元模式是一种有用的设计模式,通过共享细粒度的对象,减少内存消耗和提高性能。在C++中,我们可以通过定义享元类、具体享元类和享元工厂类来应用享元模式。通过享元模式,我们可以有效地支持大量细粒度对象,并节省内存资源。享元模式的应用场景很多,例如在图形编辑器、文本编辑器或操作系统中都可以使用享元模式来优化性能。

希望本文能够帮助您深入理解享元模式的原理和优点,并通过C++的示例代码演示了如何实现享元模式。在后续的专栏文章中,我们将继续介绍更多设计模式的知识,包括原理、详细介绍、示例代码和代码解析,帮助您深入学习和应用设计模式。

参考文献:

  • Gamma, E., Helm, R., Johnson, R., & Vlissides,J. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley Professional.

    • C++ Core Guidelines: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines

    6. 注意事项:
    在使用享元模式时,需要注意以下几点:

    • 区分内部状态和外部状态:在设计享元类时,需要区分哪些状态是内部状态可以共享的,哪些状态是外部状态随外部环境变化而变化的。确保在共享对象时,只共享内部状态,而外部状态是客户端负责传递的。
    • 线程安全性:如果享元对象在多线程环境下被并发访问,需要考虑线程安全性。可以使用锁机制或其他并发控制方法来保证共享对象的线程安全性。
    • 对象池管理:对象池的管理也需要考虑合适的策略,避免对象池过大导致内存浪费,或过小导致频繁的对象创建和销毁。

    7. 总结:
    享元模式是一种重要的设计模式,通过共享细粒度的对象,减少内存消耗和提高性能。在C++中,我们可以通过定义享元类、具体享元类和享元工厂类来应用享元模式。通过享元模式,我们可以支持大量细粒度对象,并节省内存资源。享元模式在图形编辑器、文本编辑器、操作系统等领域都有广泛的应用,能够优化系统性能,提升用户体验。

    希望本文能够帮助您深入理解享元模式的原理和优点,并通过C++的示例代码演示了如何实现享元模式。设计模式是软件开发中的重要知识,掌握不同的设计模式有助于提高代码质量、可维护性和可扩展性。在后续的专栏文章中,我们将继续介绍更多设计模式的知识,包括原理、详细介绍、示例代码和代码解析,帮助您深入学习和应用设计模式。

    如果您有其他需求或主题的建议,请随时告诉我,我将为您提供更多的帮助!

    参考文献:

    • Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley Professional.
    • C++ Core Guidelines: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines

感谢您的阅读,欢迎一起探讨,共同进步,推荐大家使用学习助手AIRight来解答学习过程中的问题,访问链接:http://airight.fun/

相关文章:

篇十一:享元模式:共享细粒度对象

篇十一&#xff1a;“享元模式&#xff1a;共享细粒度对象” 设计模式是软件开发中的重要工具&#xff0c;享元模式&#xff08;Flyweight Pattern&#xff09;是结构型设计模式的一种。享元模式旨在通过共享细粒度的对象&#xff0c;减少内存消耗和提高性能。在设计模式学习中…...

Dev控件 Gridcontrol,gridview 实现多选功能

在网上看了好多实现dev控件GridControl多选功能的方法&#xff0c;都很麻烦&#xff0c;其实GridControl有一个自带的实现多选功能的控件&#xff0c;很简单。 实现效果如下 无需代码代码&#xff0c;使用GridControl中自带的多选功能&#xff0c;在界面直接设置即可 1.找到要…...

内网穿透:如何通过公网访问本地Web服务器?

文章目录 前言1. 首先安装PHPStudy2.下载一个开源的网页文件3. 选择“创建网站”并将网页内容指向下载好的开源网页文件4. 打开本地网页5. 打开本地cpolar客户端6. 保存隧道设置 生成数据隧道 前言 随着科技进步和时代发展&#xff0c;计算机及互联网已经深深融入我们的生活和…...

在qemu中挂载镜像文件

将镜像文件作为交换分区 创建镜像文件&#xff1a; dd if/dev/zero ofswap.img bs512 count131072 qemu-system-arm -nographic -M vexpress-a9 -m 64M -kernel arch/arm/boot/zImage -append "rdinit/linuxrc consolettyAMA0 loglevel8" -dtb arch/arm/boot/dts/…...

报错注入(主键重复)攻击原理

基本原理 利用数据表中主键不能重复的特点&#xff0c;通过构造重复的主键&#xff0c;使得数据库报错&#xff0c;并将报错结果返回到前端。 SQL说明函数 以pet数据表为例进行说明 rond(): 返回[0,1)区间内的任意浮点数。 count(): 返回每个组的列行数。 如&#xff0…...

Golang基础教程

Golang基础教程 golang简介安装golanggolang开发工具go常用命令golang开发 vscode快捷键如何编写golang代码golang标识符、关键字、命名规则golang变量go语言常量go语言数据类型go语言布尔类型go语言数字类型golang字符串golang格式化输出golang运算符go语言中的流程控制golan…...

ppt压缩文件怎么压缩最小?文件压缩技巧分享

在日常的工作和学习中&#xff0c;难免会遇到PPT太大&#xff0c;需要将其压缩变小的情况&#xff0c;但很多朋友还不知道怎么压缩PPT文件&#xff0c;下面就给大家分享几个简单的方法&#xff0c;分分钟缩小过大的PPT文件。 一、PowerPoint PowerPoint就是微软公司的演示文稿…...

实例033 制作闪烁的窗体

实例说明 Windows系统中&#xff0c;当程序在后台运行时&#xff0c;如果某个窗口的提示信息需要用户浏览&#xff0c;该窗口就会不停的闪烁&#xff0c;这样就会吸引用户的注意。同样&#xff0c;如果在自己的程序中使某个窗口不停的闪烁就会吸引用户的注意。本例设计了一个闪…...

【JavaEE进阶】Spring创建与使用

文章目录 一. 创建 Spring 项目1.1 创建一个Maven项目1.2 添加Spring依赖1.4. 创建一个启动类 二. 将 Bean 对象存放至 Spring 容器中三. 从 Spring 容器中读取到 Bean1. 得到Spring对象2. 通过Spring 对象getBean方法获取到 Bean对象【DI操作】 一. 创建 Spring 项目 接下来使…...

PHP8的循环控制语句-PHP8知识详解

我们在上一节讲的是条件控制语句&#xff0c;本节课程我们讲解循环控制语句。循环控制语句中&#xff0c;主要有for循环、while循环、do...while循环和foreach循环。 在编写代码时&#xff0c;经常需要反复运行同一代码块。我们可以使用循环来执行这样的任务&#xff0c;而不是…...

第八次作业

一&#xff0c;.什么是数据认证&#xff0c;有什么作用&#xff0c;有哪些实现的技术手段? 数据认证是指保证数据的真实性、完整性和可信度&#xff0c;以确保数据不被篡改或伪造。其作用包括但不限于&#xff1a; 保护关键数据不被恶意篡改或损坏 提供数据来源的可靠性和安全…...

LeetCode //C - 290. Word Pattern

290. Word Pattern Given a pattern and a string s, find if s follows the same pattern. Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in s. Example 1: Input: pattern “abba”, s “dog c…...

[保研/考研机试] 括号匹配问题 C++实现

题目描述&#xff1a; 在某个字符串(长度不超过100)中有左括号、右括号和大小写字母&#xff1b;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序&#xff0c;找到无法匹配的左括号和右括号&#xff0c;输出原来的字符串&am…...

springBoot集成caffeine,自定义缓存配置 CacheManager

目录 springboot集成caffeine Maven依赖 配置信息&#xff1a;properties文件 config配置 使用案例 Caffeine定制化配置多个cachemanager springboot集成redis并且定制化配置cachemanager springboot集成caffeine Caffeine是一种基于服务器内存的缓存库。它将数据存储在…...

【瑞吉外卖】Git部分学习

Git简介 Git是一个分布式版本控制工具&#xff0c;通常用来对软件开发过程中的源代码文件进行管理。通过Git仓库来存储和管理这些文件&#xff0c;Git仓库分为两种&#xff1a; 本地仓库&#xff1a;开发人员自己电脑上的Git仓库 远程仓库&#xff1a;远程服务器上的Git仓库…...

如何阐述自己做了一个什么样的东西

线上qps2000&#xff0c;主要的性能瓶颈在于出现在数据库I/O上。另外&#xff0c;如果是一个正常部署的容器&#xff0c;qps能达到几百就不错了。资讯服务现在做了静态的底层页&#xff0c;所以热点新闻多数会命中底层页&#xff0c;即便没有命中底层页&#xff0c;也会走多层的…...

TC3XX - MCAL知识点(二十二):QSPI 同步与异步 Mcal配置及代码实战

目录 1、MCAL配置 1.1、配置目标 1.2、同步QSPI配置 1.2.1、SpiGeneral 1.2.2、SpiMaxChannel 1.2.3、SpiMaxJob...

led台灯哪些牌子性价比高?推荐几款性价比高的护眼台灯

作为学龄期儿童的家长&#xff0c;最担心的就是孩子长时间学习影响视力健康。无论是上网课、写作业、玩桌游还是陪伴孩子读绘本&#xff0c;都需要一个足够明亮的照明环境&#xff0c;因此选购一款为孩子视力发展保驾护航的台灯非常重要。为大家推荐几款性价比高的护眼台灯。 …...

什么情况下容易发生锁表及如何处理

目录 什么情况下容易发生锁表发生锁表怎么解决 什么情况下容易发生锁表 在数据库中&#xff0c;当多个事务同时竞争访问同一个表的资源时&#xff0c;可能会发生锁表现象&#xff0c;导致性能下降甚至阻塞。以下情况容易导致锁表问题&#xff1a; 大事务操作&#xff1a;如果一…...

elk开启组件监控

elk开启组件监控 效果&#xff1a; logstash配置 /etc/logstash/logstash.yml rootnode1:~# grep -Ev "^#|^$" /etc/logstash/logstash.yml path.data: /var/lib/logstash path.logs: /var/log/logstash xpack.monitoring.enabled: true xpack.monitoring.elasti…...

QueryExcel:5分钟搞定上百个Excel文件的批量查询终极指南

QueryExcel&#xff1a;5分钟搞定上百个Excel文件的批量查询终极指南 【免费下载链接】QueryExcel 多Excel文件内容查询工具。 项目地址: https://gitcode.com/gh_mirrors/qu/QueryExcel 你是否曾面对数十甚至上百个Excel文件&#xff0c;需要从中查找特定信息&#xff…...

设计一个简单的图书借阅管理系统。

设计一个简单的图书借阅管理系统。系统初始包含若干本图书&#xff0c;每本图书的信息包括&#xff1a; 书号&#xff08;字符串&#xff09; 书名&#xff08;字符串&#xff09; 作者&#xff08;字符串&#xff09; 库存数量&#xff08;整数&#xff09; 另外&#xff0c;系…...

UniApp 集成 Cesium 实战:RenderJS 通信优化与性能调优

1. UniApp集成Cesium的挑战与解决方案 在移动端开发轻量级GIS应用时&#xff0c;很多开发者会选择UniApp作为跨平台框架&#xff0c;同时利用Cesium实现三维地图渲染。但实际集成过程中&#xff0c;最让人头疼的就是性能问题。我去年做过一个林业巡检项目&#xff0c;需要在手机…...

Vue项目本地部署神器:phpStudy+nginx配置全流程(支持多项目同时运行)

Vue项目本地部署神器&#xff1a;phpStudynginx配置全流程&#xff08;支持多项目同时运行&#xff09; 每次在本地调试Vue项目时&#xff0c;你是否也遇到过这样的困扰&#xff1f;项目打包后需要部署到服务器才能预览效果&#xff0c;但配置nginx对前端开发者来说又太过复杂。…...

破局Xbox存档困境:XGP-save-extractor技术原理与实战指南

破局Xbox存档困境&#xff1a;XGP-save-extractor技术原理与实战指南 【免费下载链接】XGP-save-extractor Python script to extract savefiles out of Xbox Game Pass for PC games 项目地址: https://gitcode.com/gh_mirrors/xg/XGP-save-extractor 用户痛点场景剧场…...

终极指南:如何快速为设计添加地图填充效果 - Sketch Map Generator 插件完全解析

终极指南&#xff1a;如何快速为设计添加地图填充效果 - Sketch Map Generator 插件完全解析 【免费下载链接】sketch-map-generator Sketch plugin to fill a shape with a map generated from a given location using Google Maps and Mapbox 项目地址: https://gitcode.co…...

跨平台迁移零成本转换:MusicFree实现音乐收藏自由的完整指南

跨平台迁移零成本转换&#xff1a;MusicFree实现音乐收藏自由的完整指南 【免费下载链接】MusicFree 插件化、定制化、无广告的免费音乐播放器 项目地址: https://gitcode.com/maotoumao/MusicFree 当你从一个音乐平台转向另一个时&#xff0c;精心整理的歌单往往成为最…...

Debian13安装基于apt的Nvidia闭源驱动+CUDA开发环境

Ubuntu安装NVIDIA驱动实在太容易了&#xff0c;直接在额外驱动里面选择就好&#xff0c;但Debian没有这么简单。以往我们都需要从NVIDIA官网下载.run文件&#xff0c;但现在其实更建议各位使用Nvidia提供的本地apt源来管理。本文只针对apt版本驱动安装过程中特定的坑和CUDA开发…...

国风美学生成模型v1.0动态生成:制作一段水墨风格动画的逐帧渲染流程

国风美学生成模型v1.0动态生成&#xff1a;制作一段水墨风格动画的逐帧渲染流程 最近在玩一个挺有意思的国风美学模型&#xff0c;它生成的水墨画效果确实惊艳。但静态图片看久了&#xff0c;我就在想&#xff0c;能不能让这些画“动”起来&#xff1f;比如&#xff0c;让一滴…...

Qwen3.5-4B模型网络协议分析与故障模拟实践

Qwen3.5-4B模型网络协议分析与故障模拟实践 1. 网络工程师的新助手 最近遇到一个典型的运维场景&#xff1a;某电商平台大促期间&#xff0c;支付接口频繁出现连接超时。运维团队抓包分析后发现TCP重传率异常&#xff0c;但传统方法定位具体原因耗时长达3小时。这正是Qwen3.5…...