Singleton 是邪恶的

banq 04-11-09
                   

Singleton 是邪恶的,为什么说邪恶,因为它有陷井,或者很虚伪,容易诱骗初学者上当,我在Jdon论坛一直表达我自己这个朴素的观点,但是这种告诫却不被一些人重视,这种现象在历史上不断被重演,哥白尼不是说地球是圆的被处死了吗?当然,这个比喻可能过分了点,不要因为有人对“Singleton是邪恶的”观点有异议,就觉得它是一个遥远的神话。

"Singleton 是邪恶的",具体文章见:
http://www.pyrasun.com/mike/mt/archives/2004/11/06/15.46.14/index.html

在段落:Using the example with IoC中,第一个就是:Singletons are evil。

注意这篇文章是在最近发表的,可不是在我之前,否则又有人说我“抄袭”了。

                   

6
banq
2004-11-09 19:45

关于为什么Singleton是邪恶的,如下:

http://c2.com/cgi/wiki?SingletonsAreEvil




http://weblogs.asp.net/scottdensmore/archive/2004/05/25/140827.aspx

反方观点:
http://www.mattberther.com/2004/05/000481.html

javaWorld导航虚伪迷惑的Singletion单态(单例)模式:
http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html#resources

Picocontainer作者宣称Singleton是反模式,根本不是模式见:
http://www.picocontainer.org/Singleton+antipattern

本站关于使用Singleton在多线程场合下可能出现死锁的讨论见
http://www.jdon.com/jive/thread.jsp?forum=121&thread=17133


以上资料整理在这个帖子中,供大家学习参考用。

anonymous
2004-11-09 20:04

不妨听我讲一个最近的story。OOPSLA2004,Martin Fowler带着一帮人玩了个投票游戏:GoF的23个模式当中,哪些应该被淘汰出局。结果是,Factory Method、Flyweight、Bridge、Interpreter被全票淘汰,Singleton和Chain of Responsibility褒贬参半暂时苟延残喘。

如果在J2EE的范围内做一次正式的投票,我敢打赌Factory Method、Prototype、Singleton和Bridge绝对是在被淘汰之列,因为它们做的事情已经完全被支持Dependency Injection的容器包办了,程序员再也不需要知道这些模式。所以说呢,“Singleton是邪恶”的或者是一个非伪命题,不过更可能是一个伪问题,因为……谁还需要Singleton呢?你只需要PicoContainer或者Spring Core。

chenge
2004-11-09 22:21

这篇文章很好,对IOC的分析很透彻,谢谢banq。

应该说singleton在多线程下会存在问题比较准确。spring在创建对象的时候还是有两种模式,这似乎是无法回避的。

anonymous
2004-11-10 10:43

> 应该说singleton在多线程下会存在问题比较准确。spring在?
> 建对象的时候还是有两种模式,这似乎是无法回避的。

这跟Spring有什么关系呢?如果说有的话,恰好是Spring的“singleton=true”的配置让我们再也不必自己实现Singleton,再也不必面对Singleton的种种evil。毕竟你终归是要使用全局唯一实例的对象的。

11Go 1 2 3 4 ... 11 下一页