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

23种设计模式-结构型模式之享元模式(Java版本)

Java 享元模式(Flyweight Pattern)详解

🦋 什么是享元模式?

享元模式是一种结构型模式,它通过共享相同的对象来减少内存消耗,适用于大量细粒度对象的场景。关键思想是缓存重复出现的对象,避免重复创建。


🧠 使用场景

  • 系统中存在大量相似对象
  • 对象的状态可分为内部状态(可共享)外部状态(不可共享)
  • 对象创建代价高,影响性能

🏗️ 模式结构

  • Flyweight(享元抽象类):定义共享接口
  • ConcreteFlyweight(具体享元类):实现共享逻辑,存储内部状态
  • FlyweightFactory(享元工厂):管理享元对象池,复用已有对象

✅ 示例:围棋棋子池

享元接口(Flyweight)

public interface ChessPiece {void display(String position);
}

具体享元(ConcreteFlyweight)

public class BlackChess implements ChessPiece {@Overridepublic void display(String position) {System.out.println("⚫ 黑棋,位置:" + position);}
}public class WhiteChess implements ChessPiece {@Overridepublic void display(String position) {System.out.println("⚪ 白棋,位置:" + position);}
}

享元工厂(FlyweightFactory)

import java.util.HashMap;
import java.util.Map;public class ChessFactory {private static final Map<String, ChessPiece> cache = new HashMap<>();public static ChessPiece getChess(String color) {ChessPiece piece = cache.get(color);if (piece == null) {if (color.equalsIgnoreCase("black")) {piece = new BlackChess();} else if (color.equalsIgnoreCase("white")) {piece = new WhiteChess();}cache.put(color, piece);}return piece;}
}

客户端调用

public class Client {public static void main(String[] args) {ChessPiece black1 = ChessFactory.getChess("black");ChessPiece black2 = ChessFactory.getChess("black");ChessPiece white1 = ChessFactory.getChess("white");black1.display("A1");black2.display("B2");white1.display("C3");System.out.println("black1 与 black2 是否为同一对象?" + (black1 == black2)); // true}
}

🧩 优点

  • 大量相似对象可以复用,节省内存,提升性能

  • 将共享与非共享状态区分清晰,结构更清晰

⚠️ 缺点

  • 系统逻辑变复杂,需要区分内部与外部状态

  • 不适合对象差异性大的情况

✅ 使用建议

  • 适用于如下情况:

  • 游戏对象池(如子弹、精灵)

  • 数据库连接池、线程池

  • 文本编辑器中的字体对象共享

相关文章:

  • Java并发编程之CompletableFuture原理与实践
  • 杭电oj(1087、1203、1003)题解
  • 什么是CAN的非破坏仲裁?
  • Java基础(包装器,关键字,修饰符,Object)
  • 实验2 python的TCP群聊系统实现
  • Java基础:认识注解,模拟junit框架
  • 3dmax模型怎么导入酷家乐插件,材质贴图在,可优化不卡,可批量处理,无需打开一个个max,可批量转FBX/GLB/GLTF/OBJ/SU
  • 查询Hologres或postgresql中的数据
  • 即插即用模块(3) -LSK 特征提取
  • Spring--统一数据返回格式与统一异常处理
  • 将 MySQL 8 主从复制延迟优化到极致
  • 如何在iStoreOS DHCP中排除特定IP地址
  • zkPass案例实战之合约篇
  • 【论文#目标检测】Attention Is All You Need
  • 【泊松过程和指数分布】
  • 力扣DAY63-67 | 热100 | 二分:搜索插入位置、搜索二维矩阵、排序数组查找元素、搜索旋转排序数组、搜索最小值
  • OpenCV 图形API(52)颜色空间转换-----将 NV12 格式的图像数据转换为 RGB 格式的图像
  • 计算机视觉基础
  • 提高Spring Boot开发效率的实践
  • MsQuick编译和使用
  • 国新办发布《关于新冠疫情防控与病毒溯源的中方行动和立场》白皮书
  • 向总书记汇报具身智能发展的“稚辉君”:从期待到兴奋再到备受鼓舞
  • 腾讯重构混元大模型研发体系:成立大语言和多模态模型部,提升AI长期技术作战能力
  • 中国空间站首批在轨繁育果蝇即将返回地球,有望获得多项科学成果
  • 4月人文社科联合书单|天文学家的椅子
  • 商务部:一季度我国服务贸易较快增长,进出口总额同比增8.7%