Flyweight模式之我见

摘自 http://www.jdon.com/31903

Flyweight模式之我见

        

今天看了板桥里人的《设计模式之Flyweight(享元) FlyWeight模式
》一文,发现其中的理解有些偏差,因此在这里谈一谈自己的看法。

Flyweight的目的是为了减少内存的消耗而出现的一种模式。因此他是一种解决实现问题的模式,而不是用来解决建模问题的。

在文章的例子中说class CD是接口 Flyweight,而class Artist是ConcreteFlyweight。那就完全错了。
按照Flyweight模式,Flyweight和ConcreteFlyweight是继承关系。
而文中却成了聚合关系。
Flyweight模式中,最重要的是将对象分解成extrinsic和intrinsic两部分
在Flyweight Interface中,应该是和context有关的操作,而在例子中,看不到任何和context有关的操作。

可 见作者是将flyweight模式和object pool等同起来了。但实际上两者是由本质区别的。object pool中的对象并没有extrinsic,也不知道context的存在。比如最常见的string pool。pool中的string可以用在任何地方。

希望板桥里人先生本着对读者负责的精神,能够修改上文。

以上。

[该贴被oxygen于2007年05月28日 19:40修改过]

banq

Flyweight是为解决包含相同信息多个实例反复创建的性能开销,是一个提高性能的模式,常见EJB等J2EE中使用的Object Cache和Object Pool都属于这种Flyweight具体应用表现。


您的理解完全错误。

1. Flyweight是减少内存的使用量的一种模式,间接的可能会提高性能。两者没有必然联系。

2. Flyweight和Object pool完全不同。FlyWeight内部用到的共享机制在实现上和object cache有点像,但是有本质上的区别。不要把两者混为一谈。请仔细读一下GoF的原著。

3. Flyweight未必会减少实例的创建次数。反而可能会增加实例的创建次数。(尤其对于非JAVA语言)

4. Flyweight内部的共享机制和object pool的区别。
4.1 原理不同
object pool的原理是复用(一个对象被反复使用,但同时只有一个“人”在使用),flyweight的原理是共享(同时被多个“人”使用)。
object pool有一个很重要的特点,那就是pool中的对象是同质的。也就是说,对于使用者来说,可以用pool中的任何一个object。就好像当我们需要 connection时可以从connection pool中任意的拿一个出来使用,而Flyweight的每一个实例的内部属性都不同,完全是异质的。flyweight使用时,是去 FlyweightFactory中找一个特定的对象出来(如果没有的话,就创建一个)。flyweight的出发点是共享。而object pool中的对象是不能共享的。
4.2 运用的场合不同
object pool对应的场景是对象被频繁创建,使用,然后销毁这样一种情况。也就是说,每个对象的生命期都很短。同一时刻内,系统中存在的对象数也比较小。而Flyweight对应的情况是在同一时刻内,系统中存在大量对象。

5. Flyweight内部共享机制和object cache的区别。
5.1 原理不同
cache的原理是程序的局部访问性原理。对一小部分经常使用到的对象/数据提供一个高速的存储。而大部分数据放在一个低速的存储中。因此有cache算 法和命中率的问题。flyweight的共享机制中,并没有高速和低速的问题。也不存在命中率的问题。可能会有一个查找算法的问题。
5.2 运用场合的不同。
cache运用在一小部分对象会被经常访问到的情况。比如说论坛中置顶的帖子。
flyweight用在同时使用到大量对象的情况。比如在屏幕上绘制一张有100万个电子元器件的电路图。这个时候每个对象都被用到一次,且只被用到一次。

6 在这里再提一下Buffer这个概念。
Buffer的原理是减小访问的波动性。在软件开发上用的比较少。这里就不说了。

您尽然把差别如此之大的东西混为一谈。我也不得不说一声佩服。
看来你完全不明白什么是Flyweight模式。
而且理论基础及其薄弱。

基本原理不懂也就算了,把用途都完全不同的东西混为一谈,您是怎么帮人做咨询,教学生的?
好好学一些基础知识吧。

在这里借用一句您经常说的话,不要再误人子弟了。
[该贴被oxygen于2007年05月30日 20:18修改过]


多谢楼上详细描述。虽然最后几句话不好听,是不是有点水平的人都是这样?

不过,楼上对于Flyweight模式很多硬性定义(在与POOL的对比中)已经超过GOF原著的中定义,我不知道这些超过定义是来自楼上的经验,还是引自哪些经典,请赐教。

更重要的是:Flyweight是模式,是抽象,POOL和Cache是具象,这是两个层次的概念,进行详细比较有意义吗?

[该贴被banq于2007年05月31日 14:47修改过]


哪些超出了原著的中定义?请列举。
我会告诉你出处的。

2个从基本原理,到运用场合都不同的东西,解决的问题也截然不同,怎么个具象和抽象呢?

你说这是具象和抽象的关系,能具体说说怎么个具象法吗?

难道就是在改善性能吗?
而且我也已经说过了,flyweight和性能没有必然联系。

在这里引用一下原著中flyweight的意图
Use sharing to support large numbers of fine-grained objects efficiently。

pool里有sharing吗?
cache里有sharing吗?

pool和large numbers of objects也没什么关系,这个我前面已经详细说过了。

原著里通篇都没有提到“performance”一词,只在注释里提到一次。说的是外部特性的管理,和flyweight也没什么关系。
我不知道你的这些结论是怎么得到的。

猜你喜欢

转载自talentluke.iteye.com/blog/1731209