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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周朝 中级黑马   /  2013-5-14 22:26  /  1542 人查看  /  5 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 周朝 于 2013-5-24 12:14 编辑

看张老师的高新技术视频,在自动装箱拆箱哪里,张老师提到了 享元设计模式,但是只是理论化的提了一下,还是不太懂,麻烦大家给解释一下,最好附一下代码,麻烦大家了

评分

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

查看全部评分

5 个回复

倒序浏览
享元模式以共享的方式高效的支持大量的细粒度对象。是一种结构模式,处理类和对象之间的组合,避免大量拥有相同内容的小类的开销(入耗费内存),使大家共享一个类(元类)。
享元模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度,应用场合很多:比如从一个数据库中读取一系列的字符串,这些字符串中有很多重复的,这时候就可以讲重复的字符转存贮在Flyweight池中。

举例:
比如说一个文本系统,每个字母定义一个对象,大小写在一块一共定义52个对象。如果在一个1M的文本中有那么多的字母,如果每个字母都要定义一个对象的话内存占有量就太大了。如果每个字母都共享一个对象的话那就只用定义52个对象,用到的时候直接来拿就节省了很多资源。
public class Test
{
        public static void main(String[] args)
           {     String a = "abc";
                 String b = "abc";
                 String  c=“ab”+”c”;        
                 System.out.println(a==b);
                 System.out.println(a==c);            
           }
}

评分

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

查看全部评分

回复 使用道具 举报
王溢君 来自手机 中级黑马 2013-5-15 01:05:15
藤椅
通俗一点,就是你定义了一个变量,如inti=2,下次再定义一个int为2时.不会再开避内存空间。而是直接指向,类似就是这样。
回复 使用道具 举报
王林涛 发表于 2013-5-14 23:36
享元模式以共享的方式高效的支持大量的细粒度对象。是一种结构模式,处理类和对象之间的组合,避免大量拥有 ...

说实话 还是有点不解  感觉貌似很简单  又貌似很抽象啊
回复 使用道具 举报
如果问题已经解决了,那么大家请把帖子的类型改为“已解决”,在自己帖子的左下角点编辑,然后选择帖子的分类进行改正。{:soso_e163:}
回复 使用道具 举报
本帖最后由 Sword 于 2013-5-23 15:08 编辑

享元设计模式(flyweight):
1)概述:如果很多很小的对象,他们有很多相同的属性,那么就可变为一个对象使用,这些属性称为内部状态,还有些不同的属性,作为方法参数植入,这些称为外部状态。这种优化内存,只创建一个对象的模式,称之为享元模式。
2)应用:
(1)word中输入英文字母,可创建26对象,每个对象值是出现的位置不同(坐标),所以可用一个对象调用位置的方法:如,字母i:      i.display(intx,int y),将高度重复使用的char类型的字母i封装成一个对象使用。
(2)图标:window下的文件夹图标,只有名称这个属性不同,包含了很多其他相同的属性,那么可以应用享元模式。
(3)valueOf(int x):Integer中静态方法,将一个整数转换为Integer,即把基本数据类型变为包装类。
在举例补充一下:
//静态方法valueOf可以把一个整数变成Integer
//这不是自动装箱
//是我们手工的调用静态方法把有一个基本类型的整数变成一个包装类型的对象
  Integer i3 = Integer.valueOf(13);
  Integer i4 = Integer.valueOf(13);
  System.out.println(i3==i4);
享元设计模式举例:
Integer i1 = 13;
        Integer i2 = 13;
这两个表达式装成的是同一个Integer对象System.out.println(i1 == i2);打印出来的是true
        Integer i1 = 137;
        Integer i2 = 137
这两个表达式装成的是不同的Integer对象System.out.println(i1 == i2);打印出来的是false
数的范围在-128-127的时候把这个对象装入缓冲区,在再次取这个对象的时候是从缓冲区中取得的。
超过这个范围的时候就重新创建。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马