3. Flyweight未必会减少实例的创建次数。反而可能会增加实例的创建次数。(尤其对于非JAVA语言)
--
我觉得这个说法不对啊,如果说你使用了Flyweight模式之后,还反而会增加实例的创建次数,这说明你没用对地方,好好分析一下使用场合吧!

原理的分析上,我赞同你的观点。
[该贴被ynzhangyao于2007年07月08日 23:20修改过]

第一次注册,第一贴发言。
首先,感谢banq对我们学习Java方面做出的贡献,在这里我看到了很多新的思想。不管我现在接受哪些,以后又将接受哪些,至少我知道了这些思想,开阔了眼界。
其次,看了这么多讨论,论坛中关于各种模式讨论的很多,说说我最粗浅的理解:模式是解决特定环境下特定问题的一种总结,学习这些模式只能说是帮助我们解决别人总结过的问题,当然,我们一般碰上的问题都在这个范畴里。

看了很多,我觉得banq大哥是从实用的角度去学习和理解各种新的技术,新的问题的,banq大哥说的很多东西都是在实践中经过自己检验的。

不过看了很多,发现在论坛里有个奇怪的现象,姑且认为比较奇怪把:banq大哥好像指责过很多人是错的,不符责任。可是,在论坛中我没有看到过几个banq自己错的帖子。

回顾历史,历史上任何一个权威都范过错,难道banq大哥说的东西就没有一点是不足的?

也许是banq实践中使用过他说过的东西,所以认为能通过实践的都是对的,或者如牛顿一般,比较爱护自己的东西,所以用直流电来压制交流电。

如果是前者,希望banq把自己说的话定位在引导上,不要定位在理论上,因为你也这么批过别人,如果是后者那就有点无理+无聊了

愿共勉之。
[该贴被hulty于2007年07月11日 16:11修改过]

本人最近看模式是看完gof的某个模式,就马上来看banq对应模式的通俗讲解的例子。因为原文中的例子是基于java GUI的。

对于flyweight模式的理解,楼主的理解跟原文是一致的,而banq大侠的理解进行了自己的延伸。这也是我看完banq的模式例子后,觉得更迷惑,又回去再看了一遍原著的英文的原因。

对于初学者,确实容易造成该模式基本构造原理的误解,而banq提倡的就是学模式要掌握其构造原理的。

我同意banq的意见,模式是一种抽象,它只是抽象的描述了一件事情,应该说是一种思想,至于怎么实现,我认为可以有多种,比如Flyweight,目的是fly,只要fly就可以说是已经现在了该模式的思想内涵,你们为什么非要死扣概念,更何况,该模式也并没有明确指出具体的使用方法和使用场合,大家还是把思维抽象一点好,别再具体了,抽象怎么能和具体拉到一起讨论呢

>>您的理解完全错误。

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

对,你说的也没有错,说白了就是节约内存吧,最后导致性能提升,说它是节约内存没钱,说它是提高性能也没有错,GoF模式也是几个人工作几年归纳出来的一些看法,它们说的不一定就是绝对的对,每个人的意见可以不同呀,你们死扣概念我看是书呆子

>>object pool的原理是复用(一个对象被反复使用,但同时只有一个“人”在使用),flyweight的原理是共享(同时被多个“人”使用)。

  这个你说的也没有错,复用,也可以认为是共享呀,这个对象用完了,别的对象还可以,虽然不是同时被多个人使用,但也是被反复使用,flyweight也是被反复使用,只是能同时被多个人使用而已,这点你们也要讨论个你死我活?
  之所以这样,我想可能是因为这些对象本身太特殊了,它不让同时多个人使用,所以才出现使用上的一些小差异,不管怎么样,还是不创建多个,就一个放在内存中,被多次使用,我觉的这就已经是fly了,你们还想怎么样才叫fly

比如Connection,这个人用完了,再给其它人用,不是只让一个人使用,这难道不是共享吗?不共享,别人还能用吗?

睡觉一般是躺在床上的,如果是乞丐,他只能躺在地上睡觉,因为乞丐穷呀,没有钱呀,怎么办?这就是具体到每个人的身上情况稍不一样罢了,你总不能说人家不是在睡觉吧,所以说呀,有些模式,只要思想不离就行了,具体可以有多种实现呀,最后达到使用模式的目的,这才是我们追求的目标,你模式定义那么准,最后软件没有做到,有什么用?

Connection并不是共享,同一时刻只有一个客户端可以使用它.
oxygen是正确的.使用静态常量就可以认为是flyweight的模式一个应用.显然这跟POOL是有本质区别的.

今天看了这个帖子,我好象觉得有点疑惑了。令我产生疑惑的是banq的回复有这么一段:

==============
“我再一些英文资料是看到将Flyweight和cache/Poll 区分,我个人觉得没有意义,其实大道至简,Flyweight模式从字面上就可以知晓,将Weight实现Fly,就是将重的东西飞起来,轻量起来,那么什么是weight呢?无疑耗费内存,影响性能的东西是weight,那么怎么fly飞起来呢?就是将之事先创建在内存中或重用(这只是两种手段,手段方式可以多样,重要结果是fly)”
==============

我一直以为设计模式所注重的是解决问题的方法,但是从banq的回复中我却觉得似乎更应该注重问题解决的结果。

我对设计模式的认识浅薄,现在的疑惑令我感觉站在分岔路口上。谁能给我指明一个方向?

万分感激啊!

>所注重的是解决问题的方法,但是从banq的回复中我却觉得似乎更应该注重问题解决的结果

当解决问题的方法有多个难以抉择时,或者难以辨别时,就需要引入为什么使用模式 模式目的等这样本质问题来进行裁决。

佩服oxygen6严谨的态度。也明白 banq的用心良苦,希望简单化!但是简化是有一个过程的,要经历由简入繁,再由繁入简的过程。如果直接简化,就有些摸不着头脑了!

我怎么认为是在讨论两个东西?
一个人讲的是专用的,一个人讲的是面对实际效应而言更加抽象的。

呵呵,我觉得两位大师说的都有道理。设计模式我觉得主要是一种思想,而不能拘泥于太细节的东西,是一种高层抽象的东西,就好比制造汽车一样,我们如果懂得了汽车的发动机的基本思想,那么我们就可以制造出不同品牌的汽车来。如果不站在一个高层抽象的角度去看问题的话,我觉得很难把握住事物的本质。这只是小弟愚见,不对之处,还请各位大师指点呵呵。

再说了站在一个哲学的角度来说,世界上根本不存在完全正确的东西,GOF设计模式也不一定就全部是正确的,只要我们领会了设计模式的思想,遇到具体的问题,然后具体对待。

我很同意oxygen 的观点,我希望bang懂得虚心一点,而且,oxygen把所有的问题点用很有逻辑的方式组织,说明至少,oxygen对于flywight模式的理解已经很透彻,所以,点对点,地解释不同点。

我完全同意oxygen对flyweight的模式说明,和GoF的原文理解很一致。因为GoF原书(英文原版)中,用到的例子就是文字排版的软件,这种使用方式至少不会用到Cache这种东西,这是俩马事!

还有一点,我希望bang在对待学问的时候,不要从咬文嚼字的观点来揭示一个学术或者技术性问题,那样显得很幼稚。flyweight就是flyweight,何必拆开,然后从让weight可以fly的观点解释一个技术性词语呢?那你姓名,我们难道都要这么分析么?

还是那句话,做学问也好,做技术也好,要的是面对不足,错误,然后在改进,你天天说中国软件业需要正确的领路人,需要真正的软件理念,那么既然这么多人把这里当成了吸收养分的地方,我希望,如果你有不足,就虚心学习请教,你也不是什么大师,我们也不是真的那么没有能力的程序员。只不过,大家有一个平台可以互相学习,如果说,有人提出一点异议,你就如此的对待,那我相信,更多的高手,选择的是离开,而真正需要高手知道的人就缺少了这方面的机会,这也是为什么csdn可以做很好的原因!

你是做java的,我们知道,但是,搞得有派别,比如你崇尚DDD之类的设计理念,你可以推广,但是不能抨击其他的部队,我看很多网友有自己的理解理念,你却一直话语中不断地推广DDD,EJB,还有你的Jive框架。

老话一句:天外有天,人外有人。