享元模式通过共享内部状态减少对象数量,节省内存。将对象分为内部状态(如字体、颜色)和外部状态(如位置、内容),内部状态可共享,外部状态由客户端传入。使用享元工厂管理实例,通过缓存避免重复创建。例如文本编辑器中字符共享样式对象,大幅降低内存开销,适用于大量相似对象场景。

享元模式通过共享细粒度对象来减少内存中重复对象的数量,从而显著节省内存。它的核心思想是:将对象中可共享的状态(内部状态)与不可共享的状态(外部状态)分离,把可以共享的部分提取出来,被多个上下文复用。
内部状态与外部状态分离
享元对象的关键在于区分内部状态和外部状态:
内部状态:存储在享元对象内部,不随环境变化,可被多个对象共享,如文本字体、颜色、样式等。 外部状态:随环境改变,不能被共享,需由客户端在使用时传入,如文本的位置、内容等。
通过将内部状态抽象出来,多个相似对象可以共用同一个享元实例,避免重复创建相同属性的对象。
使用享元工厂管理实例
为了确保对象被正确共享,通常引入享元工厂(Flyweight Factory)来管理已创建的享元对象。
工厂内部维护一个缓存(如Map),以内部状态为键存储享元实例。 当请求创建享元时,先检查缓存中是否已存在,若存在则直接返回,否则新建并缓存。例如:在文本编辑器中,每个字符样式(字体、大小、颜色)作为一个享元,成千上万个字符可共享相同的样式对象,而不是每个字符都持有独立的格式对象。
减少对象数量,降低内存开销
在没有使用享元模式的系统中,每个细粒度对象(如一个字符及其格式)都会创建独立实例,导致大量内存浪费。应用享元后:
原本需要创建数万个格式对象,可能只需几百个共享实例。 对象总数大幅减少,GC压力降低,内存占用更优。
尤其在处理大量相似对象时,如图形系统中的图标、游戏中的子弹、文档中的字符格式,效果尤为明显。
基本上就这些。享元模式的关键是识别可共享的部分,合理拆分状态,并通过工厂控制实例的创建与复用。不复杂但容易忽略细节,比如外部状态的传递和线程安全问题。用好了,内存节省非常可观。
以上就是享元模式如何节省内存 共享细粒度对象技巧的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1471727.html
微信扫一扫
支付宝扫一扫