1、意图

运用共享技术有效的支持大量细粒度的对象。

2、适用性

以下情况使用Flyweight模式

(1)一个应用程序使用了大量的对象

(2)完全由于使用大量的对象,造成很大的存储开销

(3)对象的大多数状态可变化外部状态

(4)如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象

(5)应用程序不依赖于对象标识。

3、参与者

(1)Flyweight:描述一个接口,通过这个接口flyweight可以接受并作用于外部状态

(2)ConcreteFlyweight:实现Flyweight接口, 并为内部状态增加存储空间。ConcreteFlyweight对象必须是可共享的。它所存储的状态是必须是内部的

(3)UnsharedConcreteFlyweight:并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但它并不强制共享。在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点

(4)FlyweightFactory:创建并管理flyweight对象;确保合理地共享flyweight。当用户请求一个flyweight时,FlyweightFacotry对象提供一个已创建一实例或者创建一个。

(5)Client:维持一个对flyweight的引用 ;计算或存储一个(多个)flyweight的外部状态

4、协作

flyweight执行时所需要的状态必定是内部的或外部的。内部状态存储于ConcreteFlyweight对象之中,而外部对象则由Client对象存储或计算。当用户调用 flyweight对象的操作时,将该状态传递给它

用户不应直接对ConcreteFlyweight类进行实例化,而只能从FlyweightFactory对象得到ConcreteFlyweight对象,这可以保证对它们适当的进行共享。

5、效果

使用flyweight模式时,传输、查找、计算外部状态都 会产生运行时的开销,尤其当flyweight原先被存储为内部状态时。然而,空间上的节省抵消了这些开销。共享的flyweight越多,空间节省就越大。

存储节约由以下几个因素决定:

(1)因为共享,实例总数减少的数目

(2)对象内部状态的平均数目

(3)外部状态是计算的还是存储的

6、相关模式

Flyweight模式通常与Composite模式结合起来,用共享叶结点的有向无环图实现一个逻辑上的层次结构。

通常,最好用Flyweight实现State和Strategy对象

结构型模式之Flyweight模式相关推荐

  1. Java设计模式之结构型:享元模式

    一.什么是享元模式: 享元模式通过共享技术有效地支持细粒度.状态变化小的对象复用,当系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量.比如说一个文本系 ...

  2. Java设计模式之结构型:装饰器模式

    一.什么是装饰器模式: 当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能, ...

  3. 结构型设计模式之组合模式

    结构型设计模式之组合模式 组合模式 应用场景 优缺点 主要角色 组合模式结构 分类 透明组合模式 创建抽象根节点 创建树枝节点 创建叶子节点 客户端调用 安全组合模式 创建抽象根节点 创建树枝节点 创 ...

  4. 设计模式(结构型)之享元模式(Flyweight Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  5. 创建型、结构型、行为型模式(2)

    来源:http://blog.csdn.net/wulingmin21/article/details/6757111 创建型模式 Singleton模式解决的是实体对象个数的问题. 除了Single ...

  6. 创建型、结构型、行为型模式(1)

    来源:http://blog.csdn.net/wulingmin21/article/details/6753363 目的 创建型模式 Creational Pattern 结构型模式 Struct ...

  7. 设计模式——结构型之用桥梁模式(Bridge Pattern)将“抽象”与“实现”解耦(五)

    引言 相信对于现实生活中这样的情况都不陌生,比如说开关与它具体控制的电器,开关的类型多种多样,而电器也是千变万化,两者之间相对独立变化却又耦合在一起,再比如说奶茶店的奶茶,有不同规格大小.不同口味.不 ...

  8. [设计模式] 结构型:享元模式(Flyweight Pattern)

    文章目录 什么是享元模式 设计与实现 Integer应用享元模式 什么是享元模式 "享"的意思是"共享","元"的意思是"对象&q ...

  9. java-设计模式(结构型)-【代理模式】

    1.代理模式(ProxyMode) 定义:外观模式是对类与类之间关系的描述,而代理模式是对原来的方法添加其他的操作. 代理有"网关"的含义,比如用户访问论坛,则要经过代理(网关)授 ...

最新文章

  1. 深度学习--TensorFlow(4)BP神经网络(损失函数、梯度下降、常用激活函数、梯度消失梯度爆炸)
  2. selenium 浏览器driver地址
  3. 【产品】密码明文显示的必要性和解决方案
  4. js快速判断IE浏览器(兼容IE10与IE11)
  5. ubuntu12.04 安装中文输入法
  6. POJ 3517 And Then There Was One( 约瑟夫环模板 )
  7. Qt数据库编程_基本
  8. Jerry的ABAP原创技术文章合集
  9. 3dvary灯光材质为什么不亮_装修小白设计家里的灯光,知道这些参数就行了!
  10. Zen Coding 系列教程一:入门
  11. mysql limit 后子查询_mysql 关于limit 子查询和获取某当天所有记录
  12. 永不消逝的缓存数据:Adaptec 5445Z RAID卡评测(连载之一)
  13. mysql数据库在哪里写语句_Mysql数据库操作语句
  14. 安装完office没有图标_很多人不会设置路由器?只因没有弄懂安装顺序,看完你就会了...
  15. 浅谈LoRa,LoRaWAN,NB-IoT三类物联网技术
  16. Mac 微信防撤回免认证登录多开插件:Tweak
  17. idea 远程调试resin
  18. 【Unity3d学习】魔鬼与牧师(动作分离版本)
  19. 日语“不要”有几种说法。
  20. 什么是BASE最终一致性

热门文章

  1. delphi 中怎么知道某一个月有多少天
  2. CSS中常用中文字体的Unicode编码
  3. 求用1,2,5这三个数不同个数组合的和为100的组合个数
  4. Fedora 12 安装配置subversion
  5. python用什么软件编程1001python用什么软件编程-怎样才能写出 Pythonic 的代码 #P1001#...
  6. python四大软件-太牛逼!一款软件几乎可以操作所有的数据库!
  7. python是不是特别垃圾-python垃圾回收机制
  8. python教程第四版pdf下载-笨办法学python第四版 电子书(pdf格式)
  9. python为什么中文要encoding-python中encoding是什么意思
  10. python读取excel-python读写Excel