java设计模式(4):单例模式(Singleton)

2014-11-23 23:19:22 · 作者: · 浏览: 0

单例模式又叫做单态模式或者单件模式。在 GOF 书中给出的定义为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式中的“单例”通常用来代表那些本质上具有唯一性的系统组件(或者叫做资源)。比如文件系统、资源管理器等等。


单例模式的目的就是要控制特定的类只产生一个对象,当然也允许在一定情况下灵活的改变对象的个数。那么怎么来实现单例模式呢?一个类的对象的产生是由类构造函数来完成的,如果想限制对象的产生,一个办法就是将构造函数变为私有的(至少是受保护的),使得外面的类不能通过引用来产生对象;同时为了保证类的可用性,就必须提供一个自己的对象以及访问这个对象的静态方法。


现在对单例模式有了大概的了解了吧,其实单例模式在实现上是非常简单的――只有一个角色,而客户则通过调用类方法来得到类的对象。

\

单例模式可分为有状态的和无状态的。有状态的单例对象一般也是可变的单例对象,多个单态对象在一起就可以作为一个状态仓库一样向外提供服务。没有状态的单例对象也就是不变单例对象,仅用做提供工具函数。< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGJyPgo8L3A+CjxwPiAgICAgICDU2rWlwP3Eo8q9tcTKtc/Wyc/T0Ly41tayu82stcS3vcq9o6zO0tTa1eLA772r0rvSu72yveKho8/IwLS/tNK71ta3vcq9o6zL/NTaobZqYXZhINPrxKPKvaG31tCxu7PGzqq29rq6yr2hozwvcD4KPHA+PC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">public class Singleton { //在自己内部定义自己一个实例 //注意这是private 只供内部调用 private static Singleton instance = new Singleton(); //如上面所述,将构造函数设置为私有 private Singleton(){ } //静态工厂方法,提供了一个供外部访问得到对象的静态方法 public static Singleton getInstance() { return instance; } }
下面这种方式被称为懒汉式:

public class Singletion
{
	private static Singletion singletion ;
	
	private Singletion()
	{
		
	}
	
	public static Singletion getInstance()
	{
		if(singletion == null)
		{
			singletion = new Singletion();
		}
		return singletion;
	}
}

先让我们来比较一下这两种实现方式。


首先他们的构造函数都是私有的,彻底断开了使用构造函数来得到类的实例的通道,但是这样也使得类失去了多态性(大概这就是为什么有人将这种模式称作单态模式)。


在第二种方式中,对静态工厂方法进行了同步处理,原因很明显――为了防止多线程环境中产生多个实例;而在第一种方式中则不存在这种情况。

在第二种方式中将类对自己的实例化延迟到第一次被引用的时候。而在第一种方式中则是在类被加载的时候实例化,这样多次加载会照成多次实例化。但是第二种方式由于使用了同步处理,在反应速度上要比第一种慢一些。


在 《java 与模式》书中提到,就java 语言来说,第一种方式更符合java 语言本身的特点。