【设计模式】结构型模式之Flyweight

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存储一个字符代码,但它在文档中的位置和排版风格可以在字符出现时由正文排版算法和使用的格式化命令决定。字符代码是内部状态,而其它的信息则是外部状态。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值