什么是享元模式

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

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

image

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

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

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

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

享元模式的应用

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

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

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

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

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

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

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

享元模式的优点和缺点

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

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

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

posted on 2013-09-25 11:11  @且听风吟@  阅读(235)  评论(0编辑  收藏  举报