zoukankan      html  css  js  c++  java
  • 十一、结构模式之享元(Flyweight)模式

    什么是享元模式

    享元模式是对象的结构模式,是运用共享技术来有效的支持大量细粒度的对象。享元对象能做到共享的关键是区分内蕴状态外蕴状态。一个内蕴状态是存储在享元对象内部,并且是不会随环境改变而有所不同的,因此一个享元可以具有内蕴状态并可以共享。一个外蕴状态是随环境改变而改变的、不可以共享的状态。享元的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。外蕴状态不可以影响到享元对象的内蕴状态,换句话说它们是相互独立的。

    享元模式的结构图如下(源自大话设计模式)

    image

    Flyweight:是所有享元类的超类或者接口,通过这个接口,Flyweight可以接受并作用于外部状态。

    ConcreteFlyweight:继承自Flyweight,是内部状态的具体实现。

    UnsharedConcreteFlyweight:实现那些不需要共享的状态,从Flyweight接口派生使得共享成为可能,但是不强制共享。

    FlyweightFactory:享元工厂,用来创建并管理Flyweight对象,他主要是用来确保合理地共享Flyweight,当用户请求一个Flyweight时,该工厂类会为其提供一个创建好的对象或者创建一个对象(如果不存在的话)并返回。

    享元模式的应用

    当以下所有条件都满足时,可以考虑使用享元模式:

    1、 一个系统有大量的对象。

    2、 这些对象耗费大量的内存。

    3、 这些对象中状态中的大部分都可以外部化。

    4、 这些对象可以按照内蕴状态分成很多组,当把外蕴对象从对象中剔除时,每一个组都可以仅用一个对象代替。

    5、 软件系统不依赖于这些对象的身份,换言之,这些对象可以是不可分辨的。

    使用享元模式,可以通过共享对象,节约存储的开销。比如Java中的String对象就是使用了享元模式。

    享元模式的优点和缺点

    享元模式的优点在于它大幅度降低内存中对象的数量。但是做到这一点它付出的代价也是很高的:

    1、 享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。

    2、 享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。

  • 相关阅读:
    6th Alpha阶段的postmortem报告
    两种open()函数
    文件操作权限第一位的0是什么意思
    vi的查找与替换
    浅析Linux下的/etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc文件
    Linux命令总结:file
    Linux下/boot目录
    英语单词简记
    Linux下grep命令
    Linux下find命令
  • 原文地址:https://www.cnblogs.com/lovemdx/p/3338322.html
Copyright © 2011-2022 走看看