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

设计模式简述(十八)享元模式

享元模式

  • 描述
  • 基本组件
  • 使用

描述

当内存中存在大量类似的对象时,可以考虑使用享元模式减少整体内存占用。
可以将相同的部分和不同的部分进行拆分,以达到多个对象共享相同部分内存的目的。

基本组件

通常享元对象通过共享的属性映射一个享元对象。

  • 公共对象
public final class CommonData {private String province;private String city;private String county;public CommonData(String province, String city, String county) {this.province = province;this.city = city;this.county = county;}public CommonData() {}public synchronized void setData(String province, String city, String county) {this.province = province;this.city = city;this.county = county;}public String getProvince() {return province;}public String getCity() {return city;}public String getCounty() {return county;}@Overridepublic String toString() {return "CommonData{" +"province='" + province + '\'' +", city='" + city + '\'' +", county='" + county + '\'' +'}';}
}
  • 抽象享元对象(定义通用逻辑,持有公共对象)
public abstract class AbstractFlyWeight {private final CommonData commonData;private String name;protected AbstractFlyWeight(CommonData commonData) {this.commonData = commonData;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getProvince() {return commonData.getProvince();}public String getCity() {return commonData.getCity();}public String getCounty() {return commonData.getCounty();}public abstract void method();@Overridepublic String toString() {return "AbstractFlyWeight{" +"commonData=" + commonData +", name='" + name + '\'' +'}';}
}
  • 具体享元对象
public class FlyWeight extends AbstractFlyWeight {protected FlyWeight(CommonData commonData) {super(commonData);}@Overridepublic void method() {System.out.println("FlyWeight method ...");}
}
  • 享元对象工厂
public class FlyWeightFactory {private static final Map<String, CommonData> map = new ConcurrentHashMap<>();public static CommonData getFlyWeight(String key) {return map.computeIfAbsent(key, s -> {String[] split = s.split("-");assert split.length == 3;return new CommonData(split[0], split[1], split[2]);});}
}

使用

创建多个对象共用相同key的公共对象

public class Sample {public static void main(String[] args) {String key = "重庆市-渝北区-渝北区";CommonData commonData = FlyWeightFactory.getFlyWeight(key);AbstractFlyWeight flyWeight = new FlyWeight(commonData);flyWeight.setName("张三");flyWeight.method();System.out.println(flyWeight);AbstractFlyWeight flyWeight1 = new FlyWeight(commonData);flyWeight1.setName("李四");flyWeight1.method();System.out.println(flyWeight1);}
}

相关文章:

  • 游戏引擎学习第274天:基于弹簧的动态动画
  • 5.1.1 WPF中Command使用介绍
  • 2025第九届御网杯网络安全大赛线上赛 区域赛WP (MISC和Crypto)(详解-思路-脚本)
  • 力扣刷题——二分查找总结
  • 三、Hive DDL数据库操作
  • [工具]B站缓存工具箱 (By 郭逍遥)
  • 【LeetCode Hot100 | 每日刷题】排序数组
  • Python中,async和with结合使用,有什么好处?
  • Unity 红点系统
  • 06.three官方示例+编辑器+AI快速学习webgl_animation_skinning_additive_blending
  • C++23 views::repeat (P2474R2) 深入解析
  • Redis BigKey 问题是什么
  • Android Canvas API 详细说明与示例
  • Android Native 函数 Hook 技术介绍
  • 飞蛾扑火算法matlab实现
  • 【leetcode】《BFS扫荡术:如何用广度优搜索征服岛屿问题》
  • 左右括号的最小处理次数
  • 深入了解linux系统—— 自定义shell
  • 《智能网联汽车 自动驾驶功能道路试验方法及要求》 GB/T 44719-2024——解读
  • ES常识5:主分词器、子字段分词器
  • 深圳中院回应“退休夫妻月入1.2万负债1.2亿”:其自述因经营不善负债
  • 印称印巴军事行动总指挥同意将局势降级
  • 男子发寻母视频被警方批评教育,律师:发寻亲信息是正当行为
  • 马上评丨为护士减负,不妨破除论文“硬指标”
  • 美国“贸易战”前线的本土受害者:安静的洛杉矶港和准备关门的小公司
  • 印方称所有敌对行动均得到反击和回应,不会升级冲突