【读书活动感悟分享】—模式冲锋号—《设计模式:可复用面向对象软件的基础》享元模式读书笔记_文章

【读书活动感悟分享】—模式冲锋号—《设计模式:可复用面向对象软件的基础》享元模式读书笔记

朱晓林
发表于 2025-11-14 23:06:02

一、模式核心定义


       享元模式通过共享技术高效管理大量细粒度对象,核心是分离内部状态与外部状态,复用可共享的内部状态,减少对象总量,优化内存开销、提升性能。其本质是 “以空间换时间”,适用于海量相似细粒度对象场景。
      例如:围棋中的享元模式,在围棋中,所有的白色或黑色的(形状、大小,颜色都一样)只是位置不同,那像这样的情况,可以使用享元模式。

把颜色、形状、大小给共享出来(内部状态)。位置不共享(外部状态)


二、模式核心结构




1. 两种核心状态
内部状态:不随环境变化、可共享的固有属性(如固有配置、固定逻辑)。
外部状态:随场景 / 客户端需求变化、不可共享的动态属性(如动态参数、场景化配置)。
2. 四大核心角色
抽象享元(Flyweight):接口或抽象类,声明公共方法,支持访问内部状态与设置外部状态。
具体享元(Concrete Flyweight):实现抽象享元,存储内部状态,常结合单例模式确保唯一实例。
非享元(Unsharable Flyweight):不可共享的抽象享元子类,直接实例化使用。
享元工厂(Flyweight Factory):管理享元对象,客户端请求时优先复用已有实例,无则创建新对象。


三、关键要点


内部状态与外部状态的分离是核心设计思想,也是适用场景的判断标准:
内部状态:共享、稳定,独立于场景(如网站模板、核心功能模块)。
外部状态:唯一、动态,依赖场景(如用户名、个性化内容),由客户端传入维护。
分离原则:聚焦 “不变共性” 与 “可变个性”,最大化共享性与场景灵活性。



四、实际应用场景


大量相似对象场景:
如博客、电商店铺,共享模板与核心功能,传入用户个性化信息实现 “千人千面”。
池化技术:
线程池、数据库连接池、字符串常量池均基于享元思想,共享配置信息,动态管理使用状态。
特定领域场景:
文档编辑器中共享字符样式,动态传入位置、颜色;游戏粒子效果共享形状、运动规则,动态生成位置、大小等属性。


五、模式的优势与注意事项


优势
减少对象数量,降低内存占用,百万级场景优化显著。
减少对象初始化与销毁开销,提升系统响应效率。
状态分离设计,增强系统扩展性。
注意事项
需精准拆分状态,避免逻辑混乱或管理繁琐。
内部状态需设为不可变,防止线程安全问题。
对象相似度低、外部状态过多时,避免过度使用。


六、个人感悟


       享元模式的核心是 “拆分与复用”,剥离不变共性实现共享,保留可变个性适配场景。这不仅是技术手段,更是资源优化思维,帮助在功能灵活性与资源节约间找到平衡,避免盲目创建对象造成的浪费。

117 0

评论


意见反馈