• 享元模式<Flyweight Pattern>


    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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    php模拟发送GET和POST请求
    php获取从百度搜索进入网站的关键词
    HDU 6218 (线段树+set)
    Wannafly挑战赛2_D Delete(拓扑序+最短路+线段树)
    BZOJ3926 (后缀自动机)
    Codeforces 848C (cdq分治)
    CERC 2014 (动态树+主席树)
    UOJ 58 (树上带修改的莫队)
    UVA12345 (带修改的莫队)
    BZOJ2038 (莫队)
  • 原文地址:https://www.cnblogs.com/DeepInThought/p/10875733.html
  • Copyright © 2020-2023  润新知