A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qy 黑马帝   /  2011-11-12 22:45  /  2446 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天第一次接触这种模式--享元模式。
我理解的享元模式:当多个对象具有相同的属性时,把这些对象存储到一个对象中,其它不同的属性作为方法的参数传入。
好像模式的名字跟模式的解释没多大联系,挺不好记得。
问题--->这个不同的属性作为参数传入方法时,那么这个方法可不可以是一个构造函数,?
     还是普通的方法,还是对方法没有限制。

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

2 个回复

倒序浏览
qy 黑马帝 2011-11-13 09:01:39
沙发
要沉啦~~~~
回复 使用道具 举报
fso918 黑马帝 2011-11-13 13:15:25
藤椅
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。

以上都是我自己理解的享元模式,供讨论交流,楼主有不同看法可以给我发信息。
随手敲的字较多,难免有错误。呵呵
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马