设计模式之单例模式

一:定义单件模式

   单件模式(单例模式)确保一个类只有一个实例,并提供一个全局访问点


二:单件模式(单例模式)几种实现


1.第一种,也是最简单,最常用的一种:

public class Singleton {
	private static Singleton uniqueInstance;

	public static Singleton getSingleton(){
		if(null == uniqueInstance){
			uniqueInstance = new Singleton();
		}
		return uniqueInstance;
	}
	
	private Singleton(){}
}


2.但是这种经典的实现方式,在多线程时,不能保证这个类只有一个实例,我们可以将其同步(synchronized),解决这个问题。

public class Singleton {
	private static Singleton uniqueInstance;

	public static synchronized Singleton getSingleton(){
		if(null == uniqueInstance){
			uniqueInstance = new Singleton();
		}
		return uniqueInstance;
	}
	
	private Singleton(){}
}

3.第二种方式是有一些问题的,我们只有第一次执行此方法时才真正需要同步,之后每次调用,我们是不需要同步的。如果应用程序总是创建并使用单件实例,或者在创建和运行时方面的负担不太繁重,你可能要急切(eagerly)创建此单件,可以采用下面种方式。

public class Singleton {
	private static Singleton uniqueInstance = new Singleton();

	public static  Singleton getSingleton(){
		return uniqueInstance;
	}
	
	private Singleton(){}
}

4.如果性能是我们关注的重点,那么我们可以采用双重检查加锁(double-checked locking),首先检查是否实例已经创建,如果没有创建,才进行同步,这样一来,只有第一次会同步,这正是我们想要的。

public class Singleton {
	private volatile static Singleton uniqueInstance;

	public static  Singleton getSingleton(){
		if(null == uniqueInstance){
			synchronized(Singleton.class){
				if(null == uniqueInstance){
					uniqueInstance = new Singleton();
				}
			}									
		}
		return uniqueInstance;
	}

	private Singleton(){}
}

5.当然,如果getSingleton()方法的性能对应用程序不是很关键,那么我们可以选择什么都不做,同步getSingleton()方法虽然简单又有效,但是我们必须知道,同步一个方法可能造成程序执行效率下降100倍,因此,如果将getSingleton()的程序用在频繁运行的地方,我们可能要重新考虑其它的方法了。


参考资料:

1.设计模式(四)----- 单态模式(Singleton)----(JAVA版)

http://blog.csdn.net/hfreeman2011/article/details/8333325

2.Head First设计模式(中文版),中国电力出版社出版,O‘REILLY公司译----(169--190页)--单件模式


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hfreeman2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值