1、What-是什么?

  享元模式是一种轻量级的结构型模式。旨在以共享的方式高效的支持大量的细粒度对象的复用。要求能够共享的对象必须是细粒度对象,这些对象比较相似,状态变化小。

2、Why-为什么?

享元对象做到共享的关键是区分了对象的内部状态(Internal State)和外部状态(External State)。
 内部状态:存储在享元对象内部,不会随环境的变化而有所不同,是享元对象的共享部分;
 外部状态:随环境变化而变化,是不允许共享的"个性化"状态。
 外部状态有客户端保存,再享元对象被创建后,在使用时将外部状态传入享元对象内部。
 内部状态和外部状态要求互不影响。

3、When/Where-何时何地使用?

  案例一:当你要做一款文本编辑器,对于同一个字符"a",可能在不同位置多次出现,如果你将每个出现的字符都封装为一个独立的字符对象,将相当占用空间。倘若你注意到这些多次出现的字符"a"除了字符样式和位置信息不同外,其他属性均一致。那么对于这个字符对象来说,我们可将其字符样式和位置信息设置为外部状态,其他相同的属性设置为内部状态,从而达到在整个系统中虽然只使用了一个字符对象,但却可以展示出不同样式和位置的字母"a"。

  案例二:在JAVA语言中,String类型就是使用了享元模式。String对象是final类型,一旦创建就不能改变。当你尝试对其进行“改变”(截取、拼接等字符操作)时,JVM执行的实际执行的操作是new了新的String对象。同时,JVM中的String对象是共享的,当系统存在两个包含相同字符串的String对象时,JVM实际上只创建了一个对象并提供两个引用,从而实现String对象的共享。

  案例三:当你想做一款围棋软件,分析软件会发现围棋棋盘中包含大量的黑子和白子,它们除了每个棋子出现的位置不同外,其形状、大小均一致。若将每个棋子都作为一个独立的对象存储,将导致围棋软件在运行时占用较大内存空间。此时可以考虑使用享元模式。

4、How-如何使用?

推荐文章:https://www.cnblogs.com/edisonchou/p/7148258.html

  • 作者:
    DeepInThought


    出处:
    https://www.cnblogs.com/DeepInThought


    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 最新文章

    1. SQL:执行顺序
    2. hdu1963 完全背包(数据压缩)
    3. 微信分享朋友圈监听(PHP)
    4. C# 中的数组(array)
    5. attr()和prop()的区别
    6. HDU - 2825 Wireless Password(AC自己主动机+DP)
    7. 权限开发 spring security 3.0.7 序列1 数据库脚本
    8. TortoiseGit - 处理冲突
    9. jQuery插件placeholder的使用方法
    10. C#线程安全使用(五)
    11. 转发: 探秘Java中的String、StringBuilder以及StringBuffer
    12. Flutter在Windows平台下的安装配置
    13. vs2008编译openssl,静态库/动态库,批处理
    14. python 实现分治法的几个例子
    15. listview加载数据
    16. 记录 dts 里面添加 SD cd
    17. tomcat启动时常见错误问题集锦
    18. ansible入门02
    19. 撩课-Python-每天5道面试题-第9天
    20. Linux命令之chmod

    热门文章

    1. Redis集群配置和常见异常解决
    2. Java 中nextLine()方法没有执行直接跳过解决办法
    3. Docker管理面板-URLOS(易用、高效、强大)
    4. svn修改代码URL整合路径
    5. dstat 好用的命令 cpu mem io
    6. python+selenium调用JavaScript
    7. AKKA文档2.1(java版)——什么是AKKA?
    8. java第一次实验总结&第三周总结
    9. [转帖]国产CPU性能最全盘点 宜良性竞争优胜劣汰
    10. Luogu P4902 乘积