williambirkin

恭喜发财!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

意图

运用享元技术有效的支持大量细粒度的对象,共享时指在同一个场景中被多次引用而不发生变化,即共享对象的是无状态并与上下文无关的。


 

使用场合

1.一个应用程序使用了大量的对象。
2.完全由于使用大量的对象造成很大的存储开销。
3.对象的大多数状态都可以变为外部状态。
4.如果删除对象的外部状态,那么可以用相对较少俄共享对象取代很多组对象。
5.应用程序不依赖对象标识,由于享元对象可以被共享,所以对于概念上明显有别的对象,标识测试将返回真值。

 

结构

享元对象在实现上使用了注册工厂,由一个享元工厂负责管理共享对象。当用户请求享元对象时,工厂首先查找该对象是否已注册。如果注册,则返回;否则创建一个新对象,将其注册并返回。

享元的难点在于如何分离对象的动态特征,并且尽量不用保存这些特征。因为动态特征仍需要大量的对象来保存,会使享元的模式的效果大打折扣。

 

效果

享元节省了大量的内存,代价是适用享元时需要查找,从而增加了处理时间。

 

例子:围棋围棋由棋盘和棋子组成,棋子有黑子和白子。如果将棋子看成对象,其静态特征是颜色,动态特征是位子和步数。棋盘上最多有361个棋子。如果每个棋子都是一个对象,那么实例的数量将会非常多。因此我们需要减少棋子的对象。

这种情况适合享元的如下使用场合:

1.围棋中需要使用大量的细粒度对象,即棋子。
2.棋子需要反复被使用,从而导致大量的开销。
3.对象的内部状态很简单,外部状态容易分离。
4.不考虑外部状态,只用黑子和白子两个对象既可表示。
5.棋盘上的棋子没有区别,即不依赖对象标识。


Board



Stone


StoneFactory



Form1


以上仅是一个讲解享元模式的示例代码。如果要成为一个围棋游戏,还有很多细节需要考虑。

相关模式
享元模式适用于大量的细粒度对象的场合,很多模式中的对象可以作为享元共享。
1.组合模式:组合中的组件可以作为享元使用。
2.策略模式:策略对象中可以作为享元供多个对象使用。
3.解释器模式:解释器定义的终结符经常作为享元来避免生成大量的终结符实例。
4.状态模式:若干具有相同行为的对象可共享不同状态下的行为。
享元模式的实现关键是注册工厂,由工厂创建共享对象并注册,为客户返回被共享的对象。
posted on 2007-01-25 14:23  williambirkin  阅读(310)  评论(0编辑  收藏  举报