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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

wuyang

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

java享元模式与单例模式感觉怎么好像啊,请前辈指点

3 个回复

倒序浏览
我认为单例模式和享元模式的初衷是一样的。他们都是一个 基于空间和性能的模式。他们都是要控制对象的数量,而且实现方式本质上有着一些类似,就是首先查 询这个对象是否存在,然后返回这个对象。
那么从享元模式上的引申,我们就一样可以用到单例模式上了:
1. 我们可以不局限于单例,而是可以控制为多例。比如说:类似我前面对象 池的目的
2. 单例只是对象么?我们一样可以把子系统和模块单例!
看看他们的不同:
应该说享元模式是单例模式的一个延伸。享元模式通过享元工厂来控制多个对象的单例 化。而单例化解决的只是本身的单例问题!

我一直觉得,模式不要乱用,乱用模式是学习的阶段,但是一旦在工作中,我们去乱用 模式,那么可能会造成很惨的后果。
1. 系统中要有大量的对象,这才值得用享元模式。否则你去维护一张对象表 ,就不值得了。
2. 对象的创建是会消耗大量时间的过程,并且对象占用较大内存。如果不是 ,那就让系统去创建吧。
3. 在B/S的系统中,个人感觉享元的应用相对较少,Web的无状态,加之我们完全在客户端进行一系列的复 杂逻辑,然后将之统一传递给Web服务器端,而不需要享元。享元主要应用还是在C/S及Winform的本地程 序上较多。
其余的,比如,关于外蕴状态和内蕴状态究竟何种应该使用享元的问题,如果不满足情 况,您也根本没有办法去使用享元。因此,我就不在这说那些蹩嘴的定义了。

总结
享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。
回复 使用道具 举报
享元模式采用一个共享来避免大量拥有相同内容对象的开销。这种开销最常见、最直观的就是内存的损耗。享元对象能做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External State)。
  一个内蕴状态是存储在享元对象内部的,并且是不会随环境的改变而有所不同。因此,一个享元可以具有内蕴状态并可以共享。
  一个外蕴状态是随环境的改变而改变的、不可以共享的。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。外蕴状态不可以影响享元对象的内蕴状态,它们是相互独立的。
  享元模式可以分成单纯享元模式和复合享元模式两种形式。
单例模式的俩种方式:
饿汉式
class Singleton {
  private static Singleton instance=new Singleton();
  private Singleton(){}
  static Singleton getInstance() {
      return instance;
  }
}
懒汉式
class Singleton {
  private static Singleton instance=null;
  private Singleton(){}
  static Singleton getInstance() {
      if(instance==null)
      instance=new Singleton();
      return instance;
  }
}
回复 使用道具 举报
对比两个设计模式,不要仅限于代码层的比较,有的时候两个模式的代码看着差不多,但是他们所面向的问题与思想不同。首先,享元模式解决的是减少大量小对象的内存开销,单例模式解决的是某个类的实例在程序中只需要一个。其次,享元模式和单例模式,虽然都是通过共享对象来解决,但是享元模式中的对象是有外部状态的,比如,在文本编辑软件中,对字符的处理,在文件中会出现大量相同的字母,相同这是对象的内部状态,而相同的字母在不同位置有时他的颜色、背景色等等,不一样,这是外部状态,通常外部状态是通过方法传递过来的。
在说下这两个模式的代码吧
代理模式通常使用懒汉方式,代码请看2楼的,
而享元模式,可以看做是单例模式+工厂模式+合成模式,可以看下类图

推荐楼主看下,java与模式,这本书,里面讲的非常到位,相信你肯定收获很大

享元模式.PNG (298.64 KB, 下载次数: 40)

享元模式.PNG
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马