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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© youc3576 黑马帝   /  2011-9-18 17:02  /  2332 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

各位高手谁知道什么叫享元模式?今天看了张老师的课听的不懂网上找了下什么是享元模式还是不懂.这个解释谁能帮我更详细些呢?最好是通俗易懂的。说大白话。。。呵呵 基础比较差谢谢!!
      享元模式:FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。

评分

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

查看全部评分

7 个回复

倒序浏览
黑马网友  发表于 2011-9-18 17:46:48
沙发
首先通过张老师讲的例子引入享元模式:
Integer t1 = 3;
Integer t2 = 3;
System.out.println(t1==t2); 运行结果为true

Integer t1 = 137;
Integer t2 = 137;
System.out.println(t1==t2); 运行结果为false

出现上述不同运行结果的原因是,对于基本数据类型的数据,要装箱成Integer对象的时候,如果多个数据都在一个字节范围之内(-128~127),则这些数据共享同一个Integer对象,若超出这个范围,则这些数据装箱之后对应不同的Integer对象。

享元模式概念:
享元模式是对象的结构模式,它以共享的方式高效地支持大量的细粒度对象。通俗讲就是,有很多小的对象,它们有很多相同的属性,则在装箱之后共享同一个对象,这些相同的属性称为这个对象的内蕴状态,那些不同的属性,则把它们变成方法的参数,称之为这个对象的外蕴状态。

享元对象能做到共享的关键是区分内蕴状态和外蕴状态。
一个内蕴状态是存储在享元对象内部的,并且是不会随环境改变而改变的,因此一个享元可以具有内蕴状态并可以共享。
一个外蕴状态是随环境改变而改变的、不可以共享的状态。享元对象的外蕴状态必须由由端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。
外蕴状态不可以影响享元对象的内蕴状态。换句话说,它们是相互独立的。
享元模式在编辑器系统中大量使用。一个文编辑器往往会提供很多种字体,而通常的做法就是将每一个字母做成一个享元对象。享元对象的内蕴状态就是这个字母,而字母在文本中的位置和字体风格等其他信息则是外蕴状态。比如,字母a可以出现在文本的很多地方,虽然这些字母a的位置和字体风格不同,但是所有这些地方使用的都是同一个字母对象。这样一来,字母对象就可以在整个系统中共享。

享元模式的[b]优点[/b]在于它大幅度地降低内存中对象的数量,但是,它做到这一点所付出的[b]代价[/b]也是很高的:
享元模式使得系统更加复杂,为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。
享元模式将享元享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。

这是我在学习这个知识点的时候,结合张老师的讲解和网上查找的资料整理出来的,希望对你有帮助~

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 总结的不少啊!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-18 17:50:45
藤椅
就是把最常用的东西扔一个地方,需要使用时就从那个地方取出来。不用自己再new出来
回复 使用道具 举报
黑马网友  发表于 2011-9-19 12:52:13
板凳

回复 沙发 的帖子

二楼的帖子很深奥 貌似有点隐约了。。。。就是找不到开发中什么时候用这种模式的感觉。。。。谢谢了
回复 使用道具 举报
黑马网友  发表于 2011-9-19 12:52:46
报纸

回复 藤椅 的帖子

这个回答很直接 。。。。。有感觉。。。。。同谢。。。。
回复 使用道具 举报
黑马网友  发表于 2011-9-19 12:55:41
地板

回复 楼主 的帖子

享元模式:

   有很多个小的对象,它们有很多属性相同,把它们变成一个对象,那些不同的属性,把他们变成方法的参数,称之为web状态,那些相同的属性称之为内部状态。

  Integer i1=2;
  Integer i2=2;
  System.out.println(i1==i2);

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-19 14:07:16
7#
在开发中譬如自定义标识,常量,我盟通常会把它做成静态,这也算是一种享元吧
回复 使用道具 举报
黑马网友  发表于 2011-9-19 20:52:43
8#
举一小例,有主理解(百度上看到的,说的很形象~~~)
     描述:一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象。如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了。那么如果要是每个字母都共享一个对象,那么就大大节约了资源。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马