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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 乐峰 中级黑马   /  2012-7-27 17:28  /  1822 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对享元模式的概念理解的不是很明白,以及那些地方用到了享元模式也不清楚?希望各位高手帮忙指点!!

6 个回复

倒序浏览
一个程序中如果有很多相同的对象,只需要共享一份就可以了,不用每个都去实例化一个对象,这就是享元模式。
所以享元模式大大提高了程序的效率。
举个例子:
客户要买蛋糕,去下订单,订单只区分蛋糕的种类,假如下1000个订单,可是蛋糕店得蛋糕种类只有10种,
我们没有必要生成1000个订单对象,通过享元模式只需要生成10个订单对象就可以
回复 使用道具 举报
说通俗点就是一个对象多处用到。
例如:你做一个五子棋游戏,你的棋子就可以用到享元模式了,你只需要实例一个棋子对象即可,在下棋的时候其实只有一个棋子对象,而不是每个棋子都是个新的对象,这样可以很大程序减少创建对象,可以提高效率,节约内存。
回复 使用道具 举报
本帖最后由 柳雷 于 2012-7-27 20:06 编辑

这是我技术日志的内容,上面说的很清楚:
一、介绍
享元模式是在软件设计中应用较多的模式之一。它适用于多个事物具有较多的共性,如果每个事物都创建一个对象,势必造成内存的浪费,为了节省内存空间,就有人想到一种设计方式,让多个事物共享他们共有的东西,而不同的东西使用外部数据结构,当需要时再把他们传递给享元。

享元模式在编辑器系统中大量使用。一个文本编辑器往往会提供很多种字体,而通常的做法就是将每一个字母做成一个享元对象。享元对象的内蕴状态就是这个字母,而字母在文本中的位置和字模风格等其他信息则是外蕴状态。比如,字母a可能出现在文本的很多地方,虽然这些字母a的位置和字模风格不同,但是所有这些地方使用的都是同一个字母对象。这样一来,字母对象就可以在整个系统中共享。
二、总结享元模式优点就在于它能够大幅度的降低内存中对象的数量;而为了做到这一步也带来了它的缺点:它使得系统逻辑复杂化,而且在一定程度上外蕴状态影响了系统的速度。

所以一定要切记使用享元模式的条件:

1)系统中有大量的对象,他们使系统的效率降低。

2)这些对象的状态可以分离出所需要的内外两部分。

外蕴状态和内蕴状态的划分以及两者关系的对应也是非常值得重视的。只有将内外划分妥当才能使内蕴状态发挥它应有的作用;如果划分失误,在最糟糕的情况下系统中的对象是一个也不会减少的!两者的对应关系的维护和查找也是要花费一定的空间(当然这个比起不使用共享对象要小得多)和时间的,可以说享元模式就是使用时间来换取空间的。


回复 使用道具 举报
程序设计中如果要用到许多有相同属性的对象,为了节约系统资源,把这些重复的对象视作一个对象来处理,
举例来说明,像windows系统中有很多文件夹,这些文件夹其实就是一个对象,只是它们的属性标示不同,从而可以区分。
回复 使用道具 举报
有很多对象,它们有一些相同的成员变量和成员方法,但是也存在一些方法名相同但是操作过程不同的方法,于是就把那些不一样的方法抽象化,然后把它做成一个父类,让子类来继承,子类继承了相同的方法,节省了大量内存,提高了系统效率。
public abstract class ComputerTeacher{
private String name="Java";
private int TimeCount=40;
public abstract void ShangKe();
}
public class APerson extends ComputerTeacher{
    public void ShangKe(){......}
}
public class BPerson extends ComputerTeacher{
  public void ShangKe(){.....}
}
有许多计算机老师,他们都是教Java,教的课时都是40小时,并且都有ShangKe()这个方法,这是相同的部分,但是具体上课的方法不同,那就把ShangKe这个方法抽象化,A,B两个人都继承ComputerTeacher这个类,然后复写自己的ShangKe方法,这应该算是享元模式的一种吧。
回复 使用道具 举报
基本数据类型的自动装箱过程中会判断你这个数据是否在一个字节之内,
        如果在,那么系统会将这个数据放入到一个池中缓存,这样就节省了内存空间
        因为这样小的数字使用频率是很高的,没有必要每次都创建一个对象,这是java语言
        中的一种设计模式,-127到128之间数字会采用这种设计模式
        这就是享元模式flyweight 设计模式  类似于word文档 还有文件的显示  重复的字母不是两个对象 是一个对象 而区分它们的是
        一种显示方法 display(char,int x ,int y) 文件是一个对象,位置和名字是不同的。
        我的理解是:有很多小的对象,每个对象都有相同的属性 那么我们就可以当成一个对象,然后把这些对象的属性
        变成可变的参数来处理。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马