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

享元设计模式

享元模式(Flyweight Pattern)是一种用于减少对象创建数量、节省内存的设计模式,核心是通过共享 “细粒度对象” 来避免重复创建。它适用于存在大量相似对象的场景,比如游戏中的士兵、文本编辑器中的字符等。
使用场景:对象的状态可以外部化,即对象的部分状态可以独立于对象本身存在。


假设你在开发一款战争游戏,屏幕上需要显示 1000 个相同造型的士兵(比如都是 “步兵”),每个士兵会在不同位置移动、攻击。
如果不用享元模式,你可能会为每个士兵创建一个独立对象,每个对象里包含:

  • 士兵的造型(如 “步兵” 的图片、武器模型)
  • 士兵的当前位置(x 坐标、y 坐标)
  • 士兵的血量、攻击力(假设所有步兵属性相同)

问题来了:
1000 个士兵中,“造型”“血量”“攻击力” 是完全一样的(固定属性),但每个士兵的 “位置” 不同(动态变化)。如果每个对象都存储这些重复的固定属性,会浪费大量内存(1000 个对象重复存储相同的图片、模型数据)。
用享元模式优化:
拆分状态为 “内部状态” 和 “外部状态”:
内部状态(共享):所有士兵都一样的属性,比如 “造型”“血量”“攻击力”,只需要保存一份,让所有士兵共享。
外部状态(外部化):每个士兵独有的属性,比如 “位置”,不存储在共享对象里,而是单独记录(比如存在一个 “位置列表” 中)。
具体实现:
定义一个 “步兵享元对象”(InfantryFlyweight),只包含内部状态:

class InfantryFlyweight {private String model; // 模型(如“步兵_01”)private int hp; // 血量(如100)private int attack; // 攻击力(如10)// 构造方法初始化内部状态(只创建一次)public InfantryFlyweight(String model, int hp, int attack) {this.model = model;this.hp = hp;this.attack = attack;}
}

用一个 “享元工厂” 管理这个共享对象(确保只创建一次):

class SoldierFactory {private static Map<String, InfantryFlyweight> flyweights = new HashMap<>();// 获取共享的步兵对象(相同模型只创建一次)public static InfantryFlyweight getInfantry() {String key = "infantry_01"; // 唯一标识if (!flyweights.containsKey(key)) {// 第一次创建时初始化内部状态flyweights.put(key, new InfantryFlyweight("步兵_01", 100, 10));}return flyweights.get(key);}
}

外部状态(位置)单独存储,使用时结合享元对象:

// 1000个士兵的位置(外部状态,单独存储)
List<Position> positions = new ArrayList<>();
for (int i = 0; i < 1000; i++) {positions.add(new Position(i * 10, 0)); // 不同的x坐标
}// 渲染士兵时,共享同一个享元对象,搭配不同的外部状态
InfantryFlyweight sharedInfantry = SoldierFactory.getInfantry();
for (Position pos : positions) {// 用共享的士兵模型,加上当前位置,渲染到屏幕render(sharedInfantry, pos); 
}
http://www.dtcms.com/a/589273.html

相关文章:

  • VitaBench:智能体在真实交互任务中的挑战与前沿探索
  • 深度学习:python动物识别系统 YOLOv5 数据分析 可视化 Django框架 pytorch 深度学习 ✅
  • 【数据库 | 基础】DDL语句以及数据类型
  • 视觉元素网站浙江建设职业技术学院迎新网站
  • 正规网站建设费用做网站阳泉
  • Java I/O 流详解:字符流与字节流的完整指南
  • STM32外设学习-ADC模数转换器(代码部分)四个模块,光敏,热敏,电位,反射式红外。
  • 公众号开发网站购物网站开发介绍
  • 结构型设计模式2
  • 怎么做ppt教程网站灰色项目源码
  • 蛋白质内在无序区域(IDR)预测benchmark
  • 【TIDE DIARY 7】临床指南转公众版系统升级详解
  • STM32百问百答:从硬件到软件全面解析
  • MyBatis-Plus 框架设计模式全景解析
  • 创建型设计模式1
  • AI大数据在医疗健康中的应用与发展趋势
  • 网站规划与开发实训室建设方案个人如何做微商城网站
  • 标准 Python 项目结构
  • 【开发者导航】面向快速模型演示与轻量交互开发的可视化工具:Gradio
  • Vue 项目实战《尚医通》,首页常见科室静态搭建,笔记16
  • 东莞热的建设网站网页视频怎么下载到电脑上
  • 区块链论文速读 CCF A--USENIX Security 2025(4)
  • PHM数据集轴承寿命预测!Transformer-GRU轴承寿命预测MATLAB代码实现
  • 网站错误代码301建设网站如何给页面命名
  • FreeRTOS 学习:(十六)可调用 FromISR 相关 API 函数的中断优先级范围
  • 织梦网站修改使用教程郑州高端网站建设怎么样
  • GPU集群poc测试
  • 操作系统(12)进程描述与控制--进程概述(2)
  • 数据库库、表的创建及处理
  • 空间矢量脉宽调制(Space Vector Pulse Width Modulation)SVPWM基础