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

【设计模式】享元模式

  • 享元模式属于结构型设计模式

    核心思想是通过共享技术,实现相似对象的高效复用。用 1%的资源支撑100%的需求——通过对象状态的分离与共享,用最小内存支持海量对象

    内部状态:对象中不变的部分共享

    外部状态:对象中变化的部分非共享

适用场景

  • 系统中存在大量相似或相同的对象
  • 对象创建/销毁成本较高
  • 对象状态可以外部变化,即对象状态独立于对象本身存在。

核心组件

  • 享元接口:定义外部状态的方法,规定可以共享的状态
  • 实现类:实现类,存储内部状态,实现具体业务逻辑
  • 享元工厂:用于对象池的管理,控制对象的创建和复用

类图

在这里插入图片描述

//抽象 享元类
public abstract class AbstractBikeFlyWeight {private String color;private int price;public AbstractBikeFlyWeight(String color, int price) {this.color = color;this.price = price;}public abstract String show();}
//实现类
public class OneBike extends AbstractBikeFlyWeight {public OneBike(String color, int price) {super(color, price);}@Overridepublic String show() {return "one bike color: " + color + " price: " + price;}
}public class TwoBike extends AbstractBikeFlyWeight {public TwoBike(String color, int price) {super(color, price);}@Overridepublic String show() {return "two bike color: " + color + " price: " + price;}
}//工厂
public class Factory {private static Map<String,AbstractBikeFlyWeight> bikeMapping = new HashMap<>();public static AbstractBikeFlyWeight getBike(String color, String type) {String key = color + type;if (bikeMapping.containsKey(key)) {return bikeMapping.get(key);}else  {AbstractBikeFlyWeight bike;switch (color) {case "one":bike = new OneBike();break;case "two":bike = new TwoBike();break;default:throw new IllegalArgumentException("Invalid color: " + color);}bike.setColor(color);bike.setType(type);return bike;}}}

模式的优点缺点

优点

  • 内存优化:可以减少对象的存储
  • 性能提升:降低GC压力,提高缓存命中率
  • 资源复用:避免重复资源的浪费

缺点

  • 增加系统的复杂性:需要区分可共享和不可共享的逻辑
  • 需要考虑线程安全的场景

总结

当系统面临对象数量爆炸性增长,占用内存过大的情况,可以考虑是否使用享元模式。同时还要确认对象是否存在可复用的逻辑以及多少状态可以在外部传递进行处理。

http://www.xdnf.cn/news/2427.html

相关文章:

  • .aar中申请权限时使用了android:maxSdkVersion导致主App的权限组找不到对应的权限
  • 【机器学习-线性回归-4】线性回归中的最优解:从数学原理到实践应用
  • ESP32开发入门(四):ESP32-s3多串口开发实践
  • 深度整合Perforce P4+Jira+Confluence:游戏开发团队协作工具链搭建指南
  • 力扣热题——统计完全子数组的数目
  • 【MQ篇】RabbitMQ之死信交换机!
  • Node.js CSRF 保护指南:示例及启用方法
  • react slot传递
  • Python 操作 Excel 插入图表:解锁数据可视化的高效密码
  • 使用vue2 开发一个纯静态的校园二手交易平台-前端项目练习
  • WEBSTORM前端 —— 第2章:CSS —— 第3节:背景属性与显示模式
  • SpringMVC 通过ajax 前后端数据交互
  • 空间矩阵的思考
  • SpringMVC框架
  • 二、Web服务常用的I/O操作
  • HTML5 新特性详解:语义化标签、表单与音视频嵌入
  • pytorch写张量pt文件,libtorch读张量pt文件
  • 网络基础概念
  • HCIP知识点总结思维导图
  • Redis远程链接应用案例
  • 【计算机网络物理层】从信号传输到介质选型的核心技术解析
  • Web服务器技术选型指南:主流方案、核心对比与策略选择
  • 数据可视化 —— 饼图
  • 《MySQL 技术内幕-innoDB 存储引擎》笔记
  • 简述删除一个Pod流程?
  • HTTP:十二.HTTPS
  • UE 新建一个自带光照的场景
  • Git常用命令简明教程
  • 【每日随笔】文化属性 ① ( 天机 | 强势文化与弱势文化 | 文化属性的形成与改变 | 强势文化 具备的特点 )
  • 有源晶振输出匹配电阻选择与作用详解