【设计模式】结构型模式之Flyweight
来源:互联网 发布:zuk z2 网络较慢 编辑:程序博客网 时间:2024/06/05 17:35
Flyweight是一种对象结构型设计模式,意在运用共享技术有效地支持大量细粒度的对象,对那些通常因为数量太大而难以用对象来表示的概念或实体进行建模。flyweight作为共享对象,可以同时在多个场景中使用,并且在每个场景中都可以作为一个独立的对象,这一点与非共享对象的实例没有区别。flyweight不能对它所运行的场景作出任何假设,这里的关键概念是内部状态和外部状态之间的区别。内部状态存储于flyweight中,它包含了独立于flyweight场景的信息,这些信息使得flyweight可以被共享。而外部状态取决于Flyweight场景,并根据场景而变化,因此不可共享。用户对象负责在必要的时候将外部状态传递给Flyweight。
Flyweight模式的结构图如下所示:
上图中,Flyweight描述一个接口,通过这个接口flyweight可以接受并作用于外部状态。ConcreteFlyweight实现Flyweight接口,如果有内部状态的话为其增加存储空间,ConcreteFlyweight对象必须是可共享的,它所存储的状态必须是内部的,独立于它所在的场景。UnsharedConcreteFlyweight是不可共享的,并非所有的Flyweight子类都需要被共享,Flyweight接口使共享成为可能,但它并不强制共享,在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。FlyweightFactory创建并管理flyweight对象,确保合理地共享flyweight,当用户请求一个flyweight时,FlyweightFactory提供一个已创建的实例或者创建一个新的实例。Client维持一个对flyweight的引用,计算并存储flyweight的外部状态。可以看出,flyweight执行时所需的状态必须是内部的或外部的,内部状态存储于ConcreteFlyweight对象之中,而外部对象则由Client对象存储或计算,当用户调用flyweight对象操作时,将该状态传递给它。用户不应直接对ConcreteFlyweight类进行实例化,而只能从FlyweightFactory对象得到ConcreteFlyweight对象,这可以保证对它们适当地进行共享。
例如,对于常用的文档编辑器来说,它所处理的单个文档可能有成千上万个字符对象,如果这些字符对象是独立的,将会耗费大量内存,产生难以接受的运行开销。所以,通常并不是对每个字符都用一个对象来表示的,采用Flyweight模式,为字母表中的每一个字母创建一个flyweight,每个flyweight存储一个字符代码,但它在文档中的位置和排版风格可以在字符出现时由正文排版算法和使用的格式化命令决定。字符代码是内部状态,而其它的信息则是外部状态。
- 【设计模式】结构型模式之Flyweight
- 【设计模式攻略】结构型模式之Flyweight 模式
- 译-设计模式-结构模式之Flyweight
- 设计模式--结构型模式之六-Flyweight享元
- 设计模式(结构型)之享元模式(Flyweight Pattern)
- 结构型模式之Flyweight模式
- 设计模式之 flyweight
- 设计模式之FlyWeight
- 设计模式之FlyWeight
- 设计模式之Flyweight
- 设计模式--FlyWeight--结构型
- 设计模式--FlyWeight--结构型
- 设计模式(11)-结构型模式-Flyweight模式
- 设计模式之FlyWeight模式
- 23种设计模式之十(结构型模式)Flyweight模式
- Java设计模式之结构型模式-享元模式(Flyweight)
- 结构型模式之六---Flyweight
- 结构型模式之享元FLYWEIGHT
- LeetCode[240] Search a 2D Matrix II(动画演示)
- 计算机基础四之数制和信息的编码上
- 拓扑法判断有向图回路
- 仿射变换
- Logistic回归与最大熵模型
- 【设计模式】结构型模式之Flyweight
- 一篇文章告诉你,该学R还是Python
- 菜鸟网络工程师的成长笔记——第2天(2016.08.19)
- 干活
- android 访问data目录、6.0模拟器读写sdcard、相关sdcard路径
- javascript学习路线level分级
- I/O篇(3)——各I/O类的用法
- 栈和队列面试题(二)
- jsp基础之--使用Session完成简单的登陆操作