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

101、23种设计模式之享元模式(10/23)

一、定义

享元模式是一种结构型设计模式,通过共享技术减少相似对象的内存占用,尤其适用于存在大量细粒度对象的场景。其核心思想是将对象状态划分为:

  • 内部状态(Intrinsic State):可共享的、不随环境变化的部分(如字形信息、颜色、形状等)。
  • 外部状态(Extrinsic State):不可共享的、随环境变化的部分(如位置、大小、用户数据等)。

通过分离状态并共享内部状态,享元模式显著减少对象数量,降低内存消耗。

二、应用场景

1.图形渲染

  • 场景:游戏或图形编辑器中需渲染大量相似对象(如树木、子弹、文本字符)。

  • 优化:将通用属性(如网格、贴图)作为内部状态共享,仅动态传递位置、颜色等外部状态。

  • 示例:森林渲染中,所有树木共享同一网格和贴图数据,仅位置和高度不同。

2.文本编辑器

  • 场景:处理大量重复字符(如长文档中的空格、标点)。
  • 优化:每个字符对象共享字形信息,仅存储位置、字体等外部状态。
  • 案例:Java字符串常量池通过共享字符串对象减少内存占用。

3.数据库连接池

  • 场景:高并发应用中频繁创建/销毁数据库连接。
  • 优化:连接池管理共享连接对象,避免重复创建开销。
  • 代码片段(C#):
public class ConnectionPool {private static Queue<DbConnection> _pool = new Queue<DbConnection>();public static DbConnection GetConnection() {if (_pool.Count == 0) return new DbConnection();return _pool.Dequeue();}public static void ReleaseConnection(DbConnection conn) {_pool.Enqueue(conn);}
}

4.游戏开发

  • 场景:管理大量相似游戏对象(如敌人、道具)。
  • 优化:共享对象类型(如敌人类型A)的公共属性(攻击力、模型),仅动态更新位置、生命值等外部状态。

三、优缺点

1.优点

  1. 显著减少内存占用,提升性能。
  2. 降低对象创建开销,提高响应速度。
  3. 适用于高并发或资源受限场景。

2.缺点

  1. 需分离内部/外部状态,增加逻辑复杂度。
  2. 需维护享元池,增加系统资源消耗。
  3. 共享对象需设计为不可变,限制灵活性。

四、C# 示例代码

using System;
using System.Collections.Generic;// 抽象享元接口
public interface IShape {void Draw(int x, int y, string color);
}// 具体享元:圆形(共享形状,颜色和位置为外部状态)
public class Circle : IShape {private string _type = "Circle";public void Draw(int x, int y, string color) {Console.WriteLine($"Drawing a {_type} at ({x},{y}) with color {color}");}
}// 享元工厂
public class ShapeFactory {private Dictionary<string, IShape> _shapes = new Dictionary<string, IShape>();public IShape GetShape(string shapeType) {if (!_shapes.ContainsKey(shapeType)) {_shapes[shapeType] = shapeType switch {"Circle" => new Circle(),_ => throw new ArgumentException("Shape not supported")};}return _shapes[shapeType];}
}// 客户端代码
public class Program {public static void Main() {ShapeFactory factory = new ShapeFactory();IShape circle1 = factory.GetShape("Circle");circle1.Draw(10, 20, "Red");    // 输出: Drawing a Circle at (10,20) with color RedIShape circle2 = factory.GetShape("Circle");circle2.Draw(30, 40, "Blue");   // 输出: Drawing a Circle at (30,40) with color BlueConsole.WriteLine(circle1 == circle2); // 输出: True(共享同一实例)}
}

五、关键点总结

  1. 状态分离:明确区分内部状态(共享)和外部状态(动态传递)。
  2. 享元工厂:通过工厂管理共享对象,避免重复创建。
  3. 不可变性:共享对象内部状态需设计为不可变,确保线程安全。
  4. 适用场景:优先在对象数量多、创建成本高、内部状态稳定的场景中使用。

享元模式通过精细化的状态管理,在内存优化与系统复杂度之间取得平衡,是处理高并发、资源受限场景的有效工具。

在这里插入图片描述


文章转载自:

http://ZIKYQhHO.grxbw.cn
http://SYyzWXPm.grxbw.cn
http://8O2bvmzL.grxbw.cn
http://0DAod48C.grxbw.cn
http://7CrX0Jwq.grxbw.cn
http://FGGsMr9E.grxbw.cn
http://2NkvNAar.grxbw.cn
http://udrCEtmQ.grxbw.cn
http://kbJHHCwE.grxbw.cn
http://IXcpV9CJ.grxbw.cn
http://xjP5xjDr.grxbw.cn
http://4w2MG2Kk.grxbw.cn
http://SsEB3xhi.grxbw.cn
http://owqHg3l5.grxbw.cn
http://cEWjpnBG.grxbw.cn
http://IpIifCvZ.grxbw.cn
http://XdQjBRLB.grxbw.cn
http://rgpXHyAZ.grxbw.cn
http://yy9aJX90.grxbw.cn
http://HoguEI5j.grxbw.cn
http://tXXLPkyU.grxbw.cn
http://hmYWQFaq.grxbw.cn
http://EzLxLNlh.grxbw.cn
http://mhhMPpqo.grxbw.cn
http://vC6K3biT.grxbw.cn
http://1jpiW0kZ.grxbw.cn
http://7keM7YfK.grxbw.cn
http://QT8D0pR4.grxbw.cn
http://6NHRpPAc.grxbw.cn
http://vENlx1dS.grxbw.cn
http://www.dtcms.com/a/377099.html

相关文章:

  • Tomcat原理
  • Linux 内核和用户空间
  • Cookie、Session和Token之间的区别
  • 大模型之词嵌入模型实现文本向量化
  • MySQL慢查询
  • 前端如何判断token是否过期
  • 当没有接口文档时,如何使用Jmeter录制和创建脚本
  • 解锁深度学习黑科技:Embedding向量嵌入探秘
  • Java 大视界 -- 基于 Java 的大数据分布式存储在数字图书馆海量资源存储与管理中的应用
  • 6、Python-Pandas数据处理与分析
  • 实现一个优雅的城市选择器组件 - Uniapp实战
  • WebSocket 双向通信实战:SCADA 移动端实时操控响应优化
  • 校园管理系统练习项目源码-前后端分离-【node版】
  • websocket和socket区别
  • Linux驱动如何向应用层提供sysfs操作接口
  • 人工智能学习:Transformer结构中的前馈全连接层
  • 项目需求分析(2)
  • 灌区泵站远程监控物联网网关解决方案
  • 【114B】基于51单片机GSM自动售货机【Keil程序+报告+原理图】
  • 【前言技术拓展Trip one】 芯片自动化和具身智能
  • Windows-Use实战:AI驱动的Windows自动化
  • OpenResty 限流方案对比:lua_shared_dict vs Redis
  • 保安员【单选题】考试题库及答案
  • 为什么90%的前端开发者永远成不了架构师?真相残酷但必须说
  • python如何提取链接中的域名
  • 简单介绍一下Clickhouse及其引擎
  • Qt信号槽机制
  • 【大数据相关】ClickHouse命令行与SQL语法详解
  • 市面上主流接口测试工具对比
  • 【51单片机】【protues仿真】基于51单片机密码锁系统