论坛首页 Java企业应用论坛

为什么需要Singleton

浏览 47992 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-06-07   最后修改:2009-06-09

为什么需要 单例设计模式(Singleton)?

像下面的一个单例

 

public class Singleton {
	private static Singleton instance = null;
	private Singleton(){};
	public static synchronized Singleton getInstance(){
		if(instance == null)
			instance = new Singleton();
		return instance;
	}
	public void doSomething(){
		//do something
	}
}


它要实现的主要目标,就是在一个应用中只维护一个Singleton实例

但一个类在一个应用中也是唯一的,为什么不能直接以类作为单例呢?

 

public final class AnotherSingleton{
	private AnotherSingleton(){}
	public static synchronized void doSomething(){
		//do something
	}
}

 

把类的所有方法都改为静态方法,

所有属性都改为静态属性(我们可以把

静态属性看成类的内部状态),

但是不允许实例化,

对类的操作相当于对单例的操作

而且类也可以维护内部状态(通过静态私有属性)

这完全满足了单例的要求。

不知道为什么需要单例模式。。。


因为我想不出来在什么情况下 单例可以满足需求

而 类 不能。

 

 

 

   发表时间:2009-06-07  
确实 ,
好像单例的特性都可以通过类的静态方法和静态属性实现。
0 请登录后投票
   发表时间:2009-06-07  
什么都写成静态的,你干嘛不用C
0 请登录后投票
   发表时间:2009-06-07  
wendong007 写道
什么都写成静态的,你干嘛不用C

C 的好特性 当然值得借鉴
java 的语法就是类 C 的

如果只有静态方法,那确实是面向过程
但类也可以有状态(静态属性)
所以我们
也可以把一个JAVA类当成一个对象
一个全局唯一的对象
这不就是Singleton吗
不过从表面上看他不是实例,而是一个类。。
0 请登录后投票
   发表时间:2009-06-07  
将类定义为final吧
0 请登录后投票
   发表时间:2009-06-07  
楼主的想法近似于MonoState模式,将所有的实例变量变成静态的,从而保证对这些变量所带来的行为进行强制单一性。
而Singleton是通过强制结构上的单一性,防止创建出多个对象实例。
这两种模式在bob martin的敏捷软件开发一书有一章曾经介绍过,楼主可以查阅该章节。
这两种方法各有千秋,不过综合来说Singleton的灵活性更大一点。
0 请登录后投票
   发表时间:2009-06-07  
至于静态方法的话,是会限制了多态,所以很多情况在oo编程中它是不被用的,除非你确定你的类完全不需要,不可能使用到多态,比如像工具类,或者像active record里面的那些find方法,很多时候技术并没有对错,只是适合不适合和你是否需要一些oo的灵活性了。
0 请登录后投票
   发表时间:2009-06-07  
这样会损失面向对象的特性
0 请登录后投票
   发表时间:2009-06-07   最后修改:2009-06-07
我觉得单例的原因是类型不能当对象用。
譬如函数传参数时你得传个对象或值,不能传类型。
所以把 static 的东西都改成非 static 的,强制只能实例化一遍,传递唯一的实例,就能模拟“传递类型”的效果了。另外 static 成员在继承的时候一坨乱糟糟也是个原因。
0 请登录后投票
   发表时间:2009-06-07  
楼主问得好,这问题困惑小的多时,期待有大大完整解答一个
kaka11 写道
至于静态方法的话,是会限制了多态,所以很多情况在oo编程中它是不被用的,除非你确定你的类完全不需要,不可能使用到多态,比如像工具类,或者像active record里面的那些find方法,很多时候技术并没有对错,只是适合不适合和你是否需要一些oo的灵活性了。

常见的单例模式实现方法由于把构造器设为private,一样限制了多态,而且它的方法一般以实例方法为主,比静态方法慢。据说单例模式比静态类容易测试,因为有办法mock
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics