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

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

享元模式

  • 描述
  • 基本组件
  • 使用

描述

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

基本组件

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

  • 公共对象
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);}
}
http://www.xdnf.cn/news/5427.html

相关文章:

  • 找银子 题解(c++)
  • EdgeOne Pages MCP 入门教程
  • 午前下单晚饭前到?亚马逊在珀斯实现!
  • 信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(十六)
  • 【并发编程】Redisson 的分布式锁
  • 基于大核感知与非膨胀卷积的SPPF改进—融合UniRepLK的YOLOv8目标检测创新架构
  • [Java实战]Spring Boot 整合 Thymeleaf (十)
  • c++的模板和泛型编程
  • C++:流插入、流提取操作符
  • Java volatile关键字深度解析与源码实现
  • 极新携手火山引擎,共探AI时代生态共建的破局点与增长引擎
  • 解锁c++模板:从入门到精通
  • vue 中的数据代理
  • go-gin
  • 多模态大语言模型arxiv论文略读(六十九)
  • 【C语言指针超详解(四)】--字符指针变量,数组指针变量,二维数组传参的本质,函数指针变量,函数指针数组,转移表
  • .NET MAUI 基础知识
  • 6.空气质量检测和语音播报
  • Nginx 源码安装成服务
  • Python与矢量网络分析仪3671E:自动化测试(Vscode)
  • 基于PySyft与TensorFlow的医疗数据协同分析系统实现教程
  • 红黑树的线程安全的做法
  • 黑名单中的随机数-leetcode710
  • sunset:Solstice靶场
  • 动态规划之背包问题总结(Java)
  • 微服务架构-限流、熔断:Alibaba Sentinel入门
  • TIME - MoE 模型代码 4——Time-MoE-main/run_eval.py
  • 前端密码加密:保护用户数据的第一道防线
  • 《微服务设计》笔记
  • CSS:盒子阴影与渐变完全解析:从基础语法到创意应用