Flyweight模式之我见

2024-03-11 21:48
文章标签 模式 flyweight 之我见

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

这篇关于Flyweight模式之我见的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/799178

相关文章

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

SQL Server身份验证模式步骤和示例代码

《SQLServer身份验证模式步骤和示例代码》SQLServer是一个广泛使用的关系数据库管理系统,通常使用两种身份验证模式:Windows身份验证和SQLServer身份验证,本文将详细介绍身份... 目录身份验证方式的概念更改身份验证方式的步骤方法一:使用SQL Server Management S

Redis高可用-主从复制、哨兵模式与集群模式详解

《Redis高可用-主从复制、哨兵模式与集群模式详解》:本文主要介绍Redis高可用-主从复制、哨兵模式与集群模式的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Redis高可用-主从复制、哨兵模式与集群模式概要一、主从复制(Master-Slave Repli

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M