Java设计模式

单例模式

单例类的定义是:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类

单例模式的特点:

单例类只能有一个实例

单例类必须自己创建自己的唯一实例

单例类必须给所有其他对象提供这一实例

在JAVA中一个类如果需要符合以上条件,就必须满足:

单例类只能有一个实例,那么在返回实例的时候,必须返回指定的那一个实例,所以在类中需要定义这个实例。

单例类自己创建自己的唯一实例,那么构造方法必须是私有的,这样在类之外就无法访问构造方法。

单例类必须给所有其他对象提供这一实例,那么类中必须要有公有的返回单个实例的方法。

 

满足了上面的条件,那么要考虑的就是如何实现,单例类只能有一个实例了。

饿汉模式:

是指在类加载的时候就创建一个实例,在需要的时候直接返回,这样就省去了在使用时构造的过程

public class EagerSingleton {

	private static EagerSingleton instance = new EagerSingleton();
	
	private EagerSingleton(){	
	}
	
	public static EagerSingleton getInstance(){
		return instance;
	}
}

 

懒汉模式:

是指在使用的时候才创建它的实例,那么就有一个同步的问题,如果两个线程同时创建它的实例,那么就有可能同时调用它生产实例的方法,导致出现2个实例。

为了解决这个问题,可以在创建实例的时候加上锁,使得只有一个线程创建实例。

public class LazySingleton {
	
	private static LazySingleton instance = null;
	
	private LazySingleton(){}
	
	public static synchronized LazySingleton getInstance(){
		if(instance == null){
			instance = new LazySingleton();
		}
		return instance;
	}
}

上面这种写法又会有一个问题,在方法上加synchronized会降低效率,多个线程同时获取对象的时候,只有一个线程可以成功创建,其他的会阻塞。

那么为了增加效率,可以将synchronized加到方法内部的代码块上:

public class Singleton {
	
	private volatile static Singleton instance = null;
	
	private Singleton(){}
	
	public static Singleton getInstance(){
		if(instance == null){
			synchronized(Singleton.class){
				if(instance == null){
					instance = new Singleton();
				}
			}
		}	
		return instance;
	}

}

 

另外,根据java static关键字的特性,可以使用静态 内部类来实现只创建一个实例。

public class SSingleton {
	
	private SSingleton(){ }
	
	private static class SingletonHolder{
		private static SSingleton instance = new SSingleton();
	}
	
	public static SSingleton getInstance(){
		return SingletonHolder.instance;
	}
}

 

posted on 2015-07-16 15:47  zxahu  阅读(109)  评论(0编辑  收藏  举报

导航