黑马程序员技术交流社区

标题: 关于享元(flyweight)模式 [打印本页]

作者: qy    时间: 2011-11-12 22:45
标题: 关于享元(flyweight)模式
今天第一次接触这种模式--享元模式。
我理解的享元模式:当多个对象具有相同的属性时,把这些对象存储到一个对象中,其它不同的属性作为方法的参数传入。
好像模式的名字跟模式的解释没多大联系,挺不好记得。
问题--->这个不同的属性作为参数传入方法时,那么这个方法可不可以是一个构造函数,?
     还是普通的方法,还是对方法没有限制。
作者: qy    时间: 2011-11-13 09:01
要沉啦~~~~
作者: fso918    时间: 2011-11-13 13:15
flyweight 模式是为了解决 细粒度对象的冗余创建 问题。
如果某一个类的对象是细粒度的,即这个类的不同对象很多,不同对象之间区别很小。典型的例子就是Integer类,它拥有很多不同对象,不同对象之间 仅仅是数值大小 不一样,而所有的操作方法都一样。在比如我们自定义的类Person,两个不同的Person之间,可能名字不一样,可能性别不一样,生日不一样,等等,所以Person类就不是细粒度的类。
对于非细粒度的类,我们创建对象,即使在创建类对象的时候,传递给类的构造函数的参数都是一样的,我们也不能返回同一个对象,而是返回一个全新的对象。因为,如果返回同一个对象,则我们对这个对象的某些属性的赋值更改,会影响所有的以相同参数构造的对象的引用。并且,我们不知道这个类除了传递进来的参数之外,这个类还有无其他属性,如果有,则这些属性的值如果不唯一,就不知道怎么给这些属性赋值了。所以,非细粒度的类,即使我们传递给构造函数的参数一模一样,我们也不能给不同的参数引用返回同一个对象。
基本上,我们所写的类都是非细粒度的,即你每次new一个对象,不管传递的参数是什么,都会返回一个全新的对象。
而对于 细粒度的类:
本质上,我们也可以将其视为非细粒度的类,每次new 一个对象的时候都返回一个全新的对象(不管传递的参数是什么),情形就是 第一次 new Integer(15)与第二次 new Integer(15)返回的不是同一个对象,即他们 == 运算返回false。
而如果假设这么做,因为细粒度类的不同对象之间区别很小,就会造成 一些非常常用的 对象(构造是传递相同参数) 会被大量重复创建,而这些对象由于是细粒度的,之间区别很小 ,所有的这些 对象 调用 自身方法,或者被其他类的方法调用,返回的结果是一样的。这就造成内存很大的浪费,因为根本没必要创建那么多得 对象,我只要在内存中保存一个对象就够了。
这就是享元模式,即对一些很常用的细粒度的类的对象,在不同时间段创建的对象的需求,返回的都是同一个对象。
Integer的享元模式:
就是很常用的一些Integer对象(-128 -- +127 之间的对象),你在不同时候创建的具有相同值大小的对象,返回的都是同一个对象。
即 Integer a = 15;Integer b = 15; a==b 返回 true。而 Integer a = 128;Integer b=128; a==b返回false。
Integer的享元模式是和自动装箱和拆箱结合在一起的,只有在自动装、拆箱时才会启用享元模式,如果你手动new 对象,是不会启用享元模式的,即 Integer a = new Integer(15);Integer b = new Integer (15); a == b ; 返回false。

以上都是我自己理解的享元模式,供讨论交流,楼主有不同看法可以给我发信息。
随手敲的字较多,难免有错误。呵呵




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2