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

享元模式 基于享元模式的对象池设计与开发应用(设计模式与开发实践 P12)

文章目录

    • 反例
    • 应用
    • 对象池
    • 对象池应用

享元模式(flyweight)是一种进行性能优化的模式,通过共享技术来支持大量细粒度的对象

如果系统中创建了大量相似的对象,我们就可以通过享元模式节省内存

反例

服装厂生产了一堆衣服,需要模特拍照片,假设有 100 个衣服被生产,就 new 了 100 个模特出来给衣服拍照片,显然内存要爆炸

这时我们把模特抽象出来,通过 更新他身上的衣服执行拍照方法,就避免了过多的内存消耗,这个步骤将对象的属性划分成了内部状态和外部状态,每个对象都有拍照这个内部属性,穿的衣服、性别都是外部属性,减少了共享对象的数量~

  • 内部状态 存储在对象内部
  • 内部状态 可以被一些对象共享
  • 内部状态 独立于场景,一般不会改变
  • 外部状态 取决于场景,根据场景变化

虽然修改外部状态也需要花费一定时间,但总比新建一个对象要好,所以这是一种时间换空间的优化方式,上面的例子中,衣服就是外部属性,拍照就是内部属性~

应用

上面的修改是基于享元模式的一个小改动,完整的享元模式还应该包含一个享元模式对象工厂,下面是 Unity 中一个常见的情景

正常来说我们用 new 创建 100 个粒子,性能可能不受影响,但 10000 个有可能就得爆炸了!

看下面的代码理解享元模式的好处在哪:

using System;
using System.Collections.Generic;// 享元接口
interface IParticle
{void Move(int x, int y);void Draw();
}// 具体享元类
class Particle : IParticle
{private string color;public Particle(string color){this.color = color;}public void Move(int x, int y){Console.WriteLine($"Moving particle to ({x}, {y})");}public void Draw(){Console.WriteLine($"Drawing particle with color: {color}");}
}// 享元工厂类
class ParticleFactory
{private Dictionary<string, IParticle> particles = new Dictionary<string, IParticle>();public IParticle GetParticle(string color){if (particles.ContainsKey(color)){return particles[color];}else{IParticle particle = new Particle(color);particles.Add(color, particle);return particle;}}
}// 游戏场景类
class GameScene
{private ParticleFactory particleFactory = new ParticleFactory();private List<IParticle> particles = new List<IParticle>();public void AddParticle(string color, int x, int y){IParticle particle = particleFactory.GetParticle(color);particle.Move(x, y);particles.Add(particle);}public void RenderScene(){foreach (var particle in particles){particle.Draw();}}
}// 测试
class Program
{static void Main(string[] args){GameScene scene = new GameScene();// 添加红色粒子到不同位置scene.AddParticle("red", 10, 20);scene.AddParticle("red", 30, 40);scene.AddParticle("red", 50, 60);// 添加蓝色粒子到不同位置scene.AddParticle("blue", 70, 80);scene.AddParticle("blue", 90, 100);// 渲染场景scene.RenderScene();}
}

对象池

对象池 维护一个 装有空闲对象 的池子,如果需要对象的时候,不是直接 new,而是从对象池里获取,如果池里没有则创建一个新的

原理很好理解,我们班人手买一本 C++ Primer Plus 可能不是那么划算,大部分时间都是闲置的,如果我们创建一个池,需要看的就去拿,看完了就还回来,不够了马上从图书馆借一本出来,这就很节约了

HTTP 连接数据库连接池 都是对象池技术的应用

对象池应用

我们举个例子,某某地图 APP 上有很多个标记 ABCDEFG,如果我们搜索兰州拉面,就会弹出来 4 个附近的兰州拉面标记,这时候如果我们换个地方搜索,弹出来了 6 个兰州拉面标记:

  • 销毁前面的兰州拉面标记重新创建
  • 利用对象池技术,前面的 4 个标记放回池里,再创建 2 个出来用

再看看上面 Unity 的例子,是否能理解为什么 享元模式 & 对象池技术在特殊的场景下是优秀的

相关文章:

享元模式 基于享元模式的对象池设计与开发应用(设计模式与开发实践 P12)

文章目录 反例应用对象池对象池应用 享元模式&#xff08;flyweight&#xff09;是一种进行性能优化的模式&#xff0c;通过共享技术来支持大量细粒度的对象 如果系统中创建了大量相似的对象&#xff0c;我们就可以通过享元模式节省内存 反例 服装厂生产了一堆衣服&#xff…...

postman测试文件上传接口教程

postman是一个很好的接口测试软件&#xff0c;有时候接口是Get请求方式的&#xff0c;肯定在浏览器都可以测了&#xff0c;不过对于比较规范的RestFul接口&#xff0c;限定了只能post请求的&#xff0c;那你只能通过工具来测了&#xff0c;浏览器只能支持get请求的接口&#xf…...

【bug日记】spring项目使用配置类和测试类操作数据库

最近学校课程要求使用spring操作数据库&#xff0c;时间有点久了&#xff0c;操作都不太熟悉了&#xff0c;遇到了很多坑&#xff0c;特此记录一下。 导入依赖 <!-- Spring Framework --> <dependency><groupId>org.springframework</groupId><ar…...

Django之主键外键详解

在ORM操作处了解的文章中&#xff0c;我们已经初步接触到了主键与外键的字段定义&#xff0c;那么本文以详细介绍主键外键的使用方法等 1.外键 在Django中&#xff0c;外键是一种关系字段&#xff0c;用于建立不同模型之间的关联关系。外键字段允许一个模型引用另一个模型的主…...

HDLbits: ece241 2014 q7b

题目要求用10进制的BCD计数器来构造1000计数&#xff0c;其实也是将1000hz的时钟信号改造成1hz&#xff0c;我们首先计算出10的三次方等于1000&#xff0c;需要三个10进制的计数器&#xff0c;去计999的中高低位。 最低位的计数器一直在对时钟信号计数&#xff0c;因此enable1…...

C++多态的理解

C多态的理解 1 C多态的概念2 C多态的类型3 虚函数实现多态案例分析3.1 非虚函数成员函数调用的案例3.1.1 测试代码3.1.2 测试运行结果 3.2 虚函数成员函数调用案例3.2.1 虚函数实现测试代码3.2.2 测试运行结果 3.3 基类析构函数的实现3.3.1 析构函数定义和实现案例3.3.2 基类析…...

关于深拷贝和浅拷贝你需要了解的内容

深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;是在复制对象或数据结构时使用的两种不同的策略&#xff0c;它们的主要区别在于复制后新旧对象之间的关系以及对嵌套对象的处理方式。 浅拷贝&#xff1a; 浅拷贝创建一个新对象&#xff…...

Visual Studio自定义模板参数、备注

模板路径&#xff1a; VS2022 x64&#xff1a;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\ItemTemplatesVS2022 x86&#xff1a;C:\Program Files (x86)\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\ItemTemplates 一、声明和启用模板…...

机器学习-数值特征

离散值处理 import pandas as pd import numpy as npvg_df pd.read_csv(datasets/vgsales.csv, encoding "ISO-8859-1") vg_df[[Name, Platform, Year, Genre, Publisher]].iloc[1:7]NamePlatformYearGenrePublisher1Super Mario Bros.NES1985.0PlatformNintendo2…...

Rocky(centos)安装nginx并设置开机自启

一、安装nginx 1、安装依赖 yum install -y gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel 2、去官网下载最新的稳定版nginx nginx: downloadhttp://nginx.org/en/download.html 3、将下载后的nginx上传至/usr/local下 或者执行 #2023-10-8更新 cd /usr/…...

Android约束布局ConstraintLayout的Guideline,CardView

Android约束布局ConstraintLayout的Guideline&#xff0c;CardView <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:a…...

LVGL8.3.6 Flex(弹性布局)

使用lv_obj_set_flex_flow(obj, flex_flow)函数 横向拖动 LV_FLEX_FLOW_ROW 将子元素排成一排而不包裹 LV_FLEX_FLOW_ROW_WRAP 将孩子排成一排并包裹起来 LV_FLEX_FLOW_ROW_REVERSE 将子元素排成一行而不换行&#xff0c;但顺序相反 LV_FLEX_FLOW_ROW_WRAP_REVERSE 将子元素…...

计算机算法分析与设计(8)---图像压缩动态规划算法(含C++)代码

文章目录 一、知识概述1.1 问题描述1.2 算法思想1.3 算法设计1.4 例题分析 二、代码 一、知识概述 1.1 问题描述 1. 一幅图像的由很多个像素点构成&#xff0c;像素点越多分辨率越高&#xff0c;像素的灰度值范围为0~255&#xff0c;也就是需要8bit来存储一个像素的灰度值信息…...

React 状态管理 - Mobx 入门(上)

Mobx是另一款优秀的状态管理方案 【让我们未来多一种状态管理选型】 响应式状态管理工具 扩展学习资料 名称 链接 备注 mobx 文档 1. MobX 介绍 MobX 中文文档 mobx https://medium.com/Zwenza/how-to-persist-your-mobx-state-4b48b3834a41 英文 Mobx核心概念 M…...

OLED透明屏技术在智能手机、汽车和广告领域的市场前景

OLED透明屏技术作为一种新型的显示技术&#xff0c;具有高透明度、触摸和手势交互、高画质和图像显示效果等优势&#xff0c;引起了广泛的关注。 随着智能手机、汽车和广告等行业的快速发展&#xff0c;OLED透明屏技术也在这些领域得到了广泛的应用。 本文将介绍OLED透明屏技…...

考研是为了逃避找工作的压力吗?

如果逃避眼前的现实&#xff0c; 越是逃就越是会陷入痛苦的境地&#xff0c;要有面对问题的勇气&#xff0c;渡过这个困境的话&#xff0c;应该就能一点点地解决问题。 众所周知&#xff0c;考研初试在大四上学期的十二月份&#xff0c;通常最晚的开始准备时间是大三暑假&…...

广州华锐互动:VR动物解剖实验室带来哪些便利?

随着科技的不断发展&#xff0c;我们的教育方式也在逐步变化和进步。其中&#xff0c;虚拟现实(VR)技术的应用为我们提供了一种全新的学习方式。尤其是在动物解剖实验中&#xff0c;VR技术不仅能够增强学习的趣味性&#xff0c;还能够提高学习效率和准确性。 由广州华锐互动开发…...

Uniapp 婚庆服务全套模板前端

包含 首页、社区、关于、我的、预约、订购、选购、话题、主题、收货地址、购物车、系统通知、会员卡、优惠券、积分、储值金、订单信息、积分、充值、礼品、首饰等 请观看 图片参观 开源&#xff0c;下载即可 链接&#xff1a;婚庆服务全套模板前端 - DCloud 插件市场 问题反…...

RabbitMQ-网页使用消息队列

1.使用消息队列 几种模式 从最简单的开始 添加完新的虚拟机可以看到&#xff0c;当前admin用户的主机访问权限中新增的刚添加的环境 1.1查看交换机 交换机列表中自动新增了刚创建好的虚拟主机相关的预设交换机。一共7个。前面两个 direct类型的交换机&#xff0c;一个是…...

弹性资源组件elastic-resource设计(四)-任务管理器和资源消费者规范

简介 弹性资源组件提供动态资源能力&#xff0c;是分布式系统关键基础设施&#xff0c;分布式datax&#xff0c;分布式索引&#xff0c;事件引擎都需要集群和资源的弹性资源能力&#xff0c;提高伸缩性和作业处理能力。 本文介绍弹性资源组件的设计&#xff0c;包括架构设计和详…...

通达信主力进场洗盘拉升出货副图指标公式源码

以下是指标365网整理的通达信主力进场洗盘拉升出货副图指标公式的源码&#xff1a;指标核心逻辑&#xff1a;1、紫色表示主力进场吸筹阶段&#xff1b;2、红色表示试盘洗盘阶段&#xff1b;3、黄色表示拉升阶段&#xff1b;4、绿色表示出货阶段&#xff1b;5、柱子长短表示各阶…...

XHS-Downloader终极指南:如何高效批量下载小红书内容

XHS-Downloader终极指南&#xff1a;如何高效批量下载小红书内容 【免费下载链接】XHS-Downloader 小红书&#xff08;XiaoHongShu、RedNote&#xff09;链接提取/作品采集工具&#xff1a;提取账号发布、收藏、点赞、专辑作品链接&#xff1b;提取搜索结果作品、用户链接&…...

AI智能体技能库:模块化设计、标准化实现与LangChain集成实战

1. 项目概述&#xff1a;一个面向AI智能体的技能库最近在折腾AI智能体&#xff08;Agent&#xff09;开发的朋友&#xff0c;估计都绕不开一个核心问题&#xff1a;如何让一个“大脑”&#xff08;大语言模型&#xff09;具备执行具体任务的能力。你可能会用LangChain、AutoGen…...

AI——Dify高级RAG优化

高级RAG优化简介一、基础RAG的核心痛点二、全流程高级优化技术&#xff08;一&#xff09;索引构建阶段&#xff1a;高质量数据底座&#xff08;二&#xff09;检索阶段&#xff1a;精准召回与重排&#xff08;三&#xff09;检索后阶段&#xff1a;上下文压缩与提纯&#xff0…...

如何在PC上免费畅玩Switch游戏:yuzu模拟器终极指南

如何在PC上免费畅玩Switch游戏&#xff1a;yuzu模拟器终极指南 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu 想要在电脑上体验任天堂Switch游戏吗&#xff1f;yuzu模拟器是你的完美选择&#xff01;作为目前最受…...

BepInEx.ConfigurationManager:3步打造专业级Unity插件配置界面

BepInEx.ConfigurationManager&#xff1a;3步打造专业级Unity插件配置界面 【免费下载链接】BepInEx.ConfigurationManager Plugin configuration manager for BepInEx 项目地址: https://gitcode.com/gh_mirrors/be/BepInEx.ConfigurationManager 你是否曾为Unity游戏…...

别再只调XGBoost参数了!试试阿里PAI这篇AAAI 2024新作AMFormer,用Transformer做表格数据效果真香

突破表格数据建模瓶颈&#xff1a;AMFormer如何用算术特征交互重塑深度学习方法 在金融风控、医疗诊断和推荐系统等实际业务场景中&#xff0c;结构化表格数据始终占据着核心地位。传统树模型如XGBoost和LightGBM凭借对特征缺失和噪声的鲁棒性&#xff0c;长期统治着这一领域。…...

ComfyUI ControlNet Aux:AI绘画精准控制的终极解决方案

ComfyUI ControlNet Aux&#xff1a;AI绘画精准控制的终极解决方案 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux ComfyUI ControlNet Aux是一个强大的AI…...

Windows本地部署Claude代码助手:架构解析与实战指南

1. 项目概述与核心价值 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“Claude-code-ChatInWindows”&#xff0c;作者是LKbaba。光看名字&#xff0c;你大概能猜到它想干什么&#xff1a;在Windows系统里&#xff0c;让Claude这个AI来帮你写代码。这听起来是不是挺酷的…...

实战解析:如何通过显卡频率优化解决CUDA/TensorRT推理速度骤降问题

1. 从异常现象到问题定位 最近在部署一个基于YOLOv5的工业检测系统时&#xff0c;遇到了一个让人头疼的问题&#xff1a;当系统从连续检测模式切换到条件触发模式后&#xff0c;原本飞快的CUDA推理速度突然下降了近5倍。更诡异的是&#xff0c;降低相机帧率后&#xff0c;推理…...