日期:2014-05-20  浏览次数:20741 次

单例,多例。各有什么优缺点?
一直没搞明白,单例,多例各有什么优缺点。实际开发者如何取舍!

------最佳解决方案--------------------
引用:
大家都在解释单例是什么!但是多例如果说不好struts2为什么就用多例,而struts1却是单例。必然没有绝对的好于坏,那么他们之间到底有什么区别?什么场景应该怎么用?!求解答啊!


struts1的单例也是被人诟病之所在……所以struts2才改成多例了。

先说下为什么用单例。
比如说现在有一个txt文档,有很多很多内容。我们需要读取这个txt的内容,就需要解析txt文件。这个解析txt文档需要花费相当相当多的时间。要是每次使用,都来new一个对象,花上数十秒时间来解析这个txt文档,实在没必要。

现在,我们使用单例,就只需要解析一次。把解析之后的txt文档,全放在一个对象里保存,然后把这个对象放到内存。这样每次要读取txt文档内容,只要直接使用那个单例对象就好。

读取配置文件也就相当于读取txt文档,一般都是使用单例来读写配置文档。

除此之外,单例的另一个应用,就是保障对象的唯一性。比如说,财务上有个“总账”,这个数据只能有一份。你要是有多个“总账”,每个“总账”的数据不相同,岂不是乱套了?怎么知道哪个是有效的?
------其他解决方案--------------------
单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点。

LZ,你可以详情的看看这个链接。
http://www.cnblogs.com/cpetcoandy/archive/2011/11/10/2244407.html
------其他解决方案--------------------
我觉得单例模式是为了解决多线程的安全的问题。
在考虑到多线程的单例模式中,一来可以防止多线程带来的安全隐患,而来可以一定程度防止死锁的问题。(个人意见)。顶LZ.
------其他解决方案--------------------
很多个类似的活,让一个人干和让几个人干,结果都一样,那就用让1个人干好了。
------其他解决方案--------------------
这个和你的需求有关吧。如果你希望全局只有一个对象,那当然用单例,否则用多例。
另外,除了多例,还有资源池的用法,比如线程池、数据库连接池,它们可以维护指定数量的对象。
------其他解决方案--------------------
单例是代表具有全局性的东西。
两者所使用的作用域不太一样。
找本设计模式,上边有的
------其他解决方案--------------------
应用场景决定吧
------其他解决方案--------------------
单例模式:有些东西只需要一个对象就可以了,比如工厂模式中的工厂。推荐看一下 《head first 设计模式》这本书

------其他解决方案--------------------
大家都在解释单例是什么!但是多例如果说不好struts2为什么就用多例,而struts1却是单例。必然没有绝对的好于坏,那么他们之间到底有什么区别?什么场景应该怎么用?!求解答啊!
------其他解决方案--------------------
引用:
大家都在解释单例是什么!但是多例如果说不好struts2为什么就用多例,而struts1却是单例。必然没有绝对的好于坏,那么他们之间到底有什么区别?什么场景应该怎么用?!求解答啊!


此外,有些情况下过分使用单例也会造成问题。
最典型例子就是Struts1。
我们知道,Struts1的action,是单实例,多线程的。我们知道,一个用户连接上来,都会分配一个新线程。但这些线程,操作的都是“同一个”action对象。每个用户的数据都是不同的,而action却只有一个,这就很容易造成这样的情况:用户A进行了操作,想翻页,页数+1;但同时用户B进行了操作,想翻页,页数-2;最终用户A、用户B都翻页到-1,这都不是用户A、用户B想要的结果。
所以程序员写Struts1的时候,都相当相当小心,都尽量不写成员变量。
Struts2的action就是每个线程一个实例,就不会出现之前那种情况了。

单例的优点:
能保障对象的唯一性;
用于读取配置文件相当合适;(因为配置文件只有一份,也只需要使用这一份);
缺点:
不合理的单例设计将导致程序编写十分麻烦。
不需要保障唯一性的对象使用单例,将会起反作用。