`
talentluke
  • 浏览: 604438 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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也没什么关系。
我不知道你的这些结论是怎么得到的。

分享到:
评论

相关推荐

    C#设计模式之Flyweight

    在C#中,Flyweight模式尤其适用于那些内部状态可共享、外部状态可变的对象场景。 享元模式通常包含以下关键角色: 1. **享元接口(Flyweight Interface)**:定义了客户程序与享元对象交互的接口,规定了享元对象能...

    软件模式之Flyweight模式.docx

    《软件模式之Flyweight模式》 Flyweight模式是一种设计模式,其主要目的是通过共享技术来减少内存中对象的数量,从而优化内存使用效率。在对象数量庞大且大部分状态可以外部化的情况下,Flyweight模式尤其适用。它...

    结构型模式之共享元模式(Flyweight)

    6共享元模式(Flyweight) 用意:以共享的方式高效地支持大量的细粒度对象

    设计模式之轻量级Flyweight

    本文将深入探讨“轻量级”设计模式之一——Flyweight(享元)模式,它是如何在减少内存消耗的同时提高系统性能的。 Flyweight模式的核心思想是共享对象,通过复用大量相似对象来减少内存占用。这种模式通常在处理...

    软件模式之Flyweight模式.doc

    软件模式之Flyweight模式.doc

    C++ Flyweight模式

    **C++ Flyweight模式** Flyweight模式是一种设计模式,属于结构型模式的一种,它主要解决的是在大量对象创建时可能导致的内存消耗问题。在计算机科学中,尤其是编程领域,内存管理是一个关键的话题,Flyweight模式...

    java设计模式之Flyweight文.pdf

    Java设计模式中的Flyweight模式是一种结构型设计模式,其主要目标是减少对象的创建,通过共享相似对象来降低内存使用和提高性能。在面向对象编程中,如果对象数量过多,可能会导致内存消耗过大,尤其是在处理大量...

    java设计模式之Flyweight[归纳].pdf

    Java设计模式中的Flyweight模式是一种结构型模式,其主要目的是减少对象的数量,通过共享大量具有相似属性的对象来节省内存和提高性能。Flyweight模式的核心思想是区分对象的内部状态(intrinsic state)和外部状态...

    c++-设计模式之享元模式(Flyweight)

    享元模式(Flyweight Pattern)是一种结构型设计模式,用于减少创建大量小对象所带来的内存开销。通过共享对象,享元模式能够有效地支持大量细粒度的对象,减少内存使用并提高性能。它常用于需要大量重复对象的场景...

    设计模式(C#)之享元模式(Flyweight Pattern)

    享元模式是设计模式中的一种结构型模式,它主要通过共享已有对象来减少内存中对象的数量,从而提高系统性能。在C#编程中,享元模式尤其适用于那些创建大量相似对象且内存消耗较大的场景。本篇文章将深入探讨享元模式...

    享元模式flyweight

    享元模式(Flyweight Pattern)是一种结构型设计模式,它能有效地减少系统中对象的数量,从而降低内存消耗,提高性能。这种模式通过共享大量相似对象的内部状态来达到这一目标,而只保留对象的外部状态在外部管理。...

    C++设计模式之享元模式(Flyweight)

    C++设计模式之享元模式(Flyweight) C++设计模式之享元模式(Flyweight)是一种结构型设计模式,主要用于解决大量相似对象的创建和操作所带来的内存负载问题。该模式的主要设计目标是通过共享对象来减少内存负载,...

    学习php设计模式 php实现享元模式(flyweight)

    享元模式是编程中常用的设计模式之一,特别是在处理大型系统和资源有限的环境中。通过对对象的内部状态和外部状态进行区分,并共享内部状态,我们能够提高系统的性能和降低内存使用。同时,理解享元模式与其他设计...

    C++设计模式编程之Flyweight享元模式结构详解

    享元模式是一种设计模式,主要用于减少对象的创建,从而提高性能和降低内存占用。在C++编程中,享元模式的应用能够帮助优化内存管理和提高程序效率。享元模式的核心思想是区分对象的内部状态(intrinsic state)和...

    设计模式学习笔记--Flyweight享元模式.docx

    享元模式的核心是Flyweight类,它是需要被共享的对象,通常包含两个部分:内在状态(Intrinsic State)和外在状态(Extrinsic State)。内在状态是指对象内部不变的部分,可以在多个对象之间共享;外在状态是随环境...

    Flyweight.rar

    飞重量(Flyweight)设计模式是一种结构型设计模式,它旨在减少对象的创建,从而节约内存,提高系统性能。在面向对象编程中,当大量相似对象的创建导致资源消耗过大时,飞重量模式就能派上用场。这个模式通过共享...

    C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式) (Level 300)

    享元模式是面向对象设计中的一种结构型模式,它的主要目的是通过共享大量相似对象来减少内存的使用,提高系统的性能。在C#编程语言中,我们可以利用享元模式来优化那些具有大量实例但大部分状态可以共享的对象。在这...

    C++设计模式课件13_Flyweight_享元模式.pdf

    ### C++设计模式之享元模式详解 #### 一、享元模式概述 享元模式(Flyweight Pattern)是设计模式中的一种优化模式,主要用于减少创建大量相似对象所需的内存消耗。在C++程序设计中,当系统中存在大量的相同或相似...

    C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式)

    C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式)

Global site tag (gtag.js) - Google Analytics