首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计方式之 Flyweight - 享元模式

2012-08-22 
设计模式之 Flyweight - 享元模式Flyweight模式也叫享元模式,是由GoF提出的23种设计模式中的一种。Flyweigh

设计模式之 Flyweight - 享元模式
Flyweight模式也叫享元模式,是由GoF提出的23种设计模式中的一种。Flyweight模式是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用。本文介绍设计模式中的享元(Flyweight)模式的概念,用法,以及实际应用中怎么样使用Flyweight模式进行开发。

[出自:维基百科wikipedia.org]

Flyweight
????目标类。需要与其他类似对象共享数据来减小内存占用的某一类事物的抽象
FlyweightFactory
????对Flyweight实例提供管理的类


调用方在生成Flyweight实例时,不直接通过new的方式而是通过FlyweightFactory#getFlyweight()取得Flyweight的一个实例。
而FlyweightFactory 对象对Flyweight实例进行管理:
调用时当Flyweight的相应实例还未生成时,则:
1,生成Flyweight实例
2,将生成的Flyweight实例保存到对象池中(pooling)
3,返回该Flyweight实例

调用时当Flyweight的相应实例已经生成时,则:
1,从对象池取出该Flyweight实例
2,返回该Flyweight实例

通过以上处理,一方面,FlyweightFactory可以在对象池里只保存最少限度的Flyweight实例;另一方面,调用方可以不用理会FlyweightFactory的内部实现细节而可以取得Flyweight实例。


????}
}


运行并显示Client:
C:\Flyweight>javac *.java
C:\Flyweight>java Client
A
B
C
D
E
B
bus2 = bus6:true
C:\Flyweight>

Flyweight模式使用提示Flyweight模式一般用于外部操作不改变Flyweight实例状态的情况下。因为如果外部操作取出了Flyweight的一个实例并在外部改变了其状态后,下一次操作取得的同一个Flyweight实例可能并具有我们所要求的状态了。
需要删除Flyweight某实例时,应该通过FlyweightFactory加以删除。
为了调用方便,FlyweightFactory类一般使用Singleton模式实现。


Flyweight模式与工厂模式的区别有关工厂模式的文章请参考:
设计模式之Abstract Factory - 抽象工厂模式
设计模式之Factory Method - 工厂方法模式

通过比较,我们可以发现Flyweight模式与工厂模式存在某些相似之处:都提供了对象工厂的功能,生成了类的实例供外部调用。
但Flyweight模式的目的是使某些相似对象共用类的同一个实例以达到节省内存空间的目的;工厂模式则不强制这一点,它只是负责生成类的实例,另外,工厂模式还通过工厂的继承来生成具有继承关系的不同类的实例,而Flyweight模式不强调这一点。

热点排行