黑马程序员技术交流社区
标题:
java享元模式与单例模式感觉怎么好像啊,请前辈指点
[打印本页]
作者:
wuyang
时间:
2012-9-15 23:19
标题:
java享元模式与单例模式感觉怎么好像啊,请前辈指点
java享元模式与单例模式感觉怎么好像啊,请前辈指点
作者:
黄敏
时间:
2012-9-16 00:06
我认为单例模式和享元模式的初衷是一样的。他们都是一个 基于空间和性能的模式。他们都是要控制对象的数量,而且实现方式本质上有着一些类似,就是首先查 询这个对象是否存在,然后返回这个对象。
那么从享元模式上的引申,我们就一样可以用到单例模式上了:
1. 我们可以不局限于单例,而是可以控制为多例。比如说:类似我前面对象 池的目的
2. 单例只是对象么?我们一样可以把子系统和模块单例!
看看他们的不同:
应该说享元模式是单例模式的一个延伸。享元模式通过享元工厂来控制多个对象的单例 化。而单例化解决的只是本身的单例问题!
我一直觉得,模式不要乱用,乱用模式是学习的阶段,但是一旦在工作中,我们去乱用 模式,那么可能会造成很惨的后果。
1. 系统中要有大量的对象,这才值得用享元模式。否则你去维护一张对象表 ,就不值得了。
2. 对象的创建是会消耗大量时间的过程,并且对象占用较大内存。如果不是 ,那就让系统去创建吧。
3. 在B/S的系统中,个人感觉享元的应用相对较少,Web的无状态,加之我们完全在客户端进行一系列的复 杂逻辑,然后将之统一传递给Web服务器端,而不需要享元。享元主要应用还是在C/S及Winform的本地程 序上较多。
其余的,比如,关于外蕴状态和内蕴状态究竟何种应该使用享元的问题,如果不满足情 况,您也根本没有办法去使用享元。因此,我就不在这说那些蹩嘴的定义了。
总结
享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。
作者:
史小兵
时间:
2012-9-16 08:43
享元模式采用一个共享来避免大量拥有相同内容对象的开销。这种开销最常见、最直观的就是内存的损耗。享元对象能做到共享的关键是区分内蕴状态(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;
}
}
作者:
佟亚鹏
时间:
2012-9-16 12:37
对比两个设计模式,不要仅限于代码层的比较,有的时候两个模式的代码看着差不多,但是他们所面向的问题与思想不同。首先,享元模式解决的是减少大量小对象的内存开销,单例模式解决的是某个类的实例在程序中只需要一个。其次,享元模式和单例模式,虽然都是通过共享对象来解决,但是享元模式中的对象是有外部状态的,比如,在文本编辑软件中,对字符的处理,在文件中会出现大量相同的字母,相同这是对象的内部状态,而相同的字母在不同位置有时他的颜色、背景色等等,不一样,这是外部状态,通常外部状态是通过方法传递过来的。
在说下这两个模式的代码吧
代理模式通常使用懒汉方式,代码请看2楼的,
而享元模式,可以看做是单例模式+工厂模式+合成模式,可以看下类图
推荐楼主看下,java与模式,这本书,里面讲的非常到位,相信你肯定收获很大
享元模式.PNG
(298.64 KB, 下载次数: 45)
下载附件
2012-9-16 12:36 上传
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2