有一些对象其实我们只需要一个,比如说,任务管理器。这些类对象只能有一个实例。如果制造出多个实例,就会导致许多问题产生,例如:资源使用过量,或者是数据不一致的结果。
单例模式提供了一个全家访问点,和全局变量一样方便。又没有全局变量的缺点。全局变量的缺点是如果将对象赋值给一个全局变量,那么你必须在程序一开始就创建好对象。如果这个对象非常消耗资源,而程序在这次的执行过程中又一直没用到它,就会形成浪费。而单例模式,是在需要的时候才创建对象。
单例模式:确保一个类只有一个实例,并提供一个全局访问点。
<span style="font-family:KaiTi_GB2312;font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:24px;">public class Singleton{
private static Singleton uniqueInstance; //声明私有的Singleton类型的静态变量 uniqueInstance
private Singleton(){} //私有的构造方法
public static Singleton getInstance(){ //公有的方法getInstance,用来实例化Singleton
if(uniqueInstance ==null)
{
uniqueInstance = new Singleton();
}
return uniqueInstance();
}
}</span></span>
分析上述代码:如果uniqueInstance是空的,表示还没有创建实例,当它不存在时,我们利用私有的构造方法创建一个Singleton实例,并把它赋值给静态变量:uniqueInstance。如果我们不需要这个实例,它就永远不会产生。这就是“延迟”实例化。也就是我们所说的“懒汉式”。
如果应用程序总是创建并使用单例实例,我们想要快速创建此单例。代码如下所示:
<span style="font-family:KaiTi_GB2312;font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:24px;">public class Singleton{
private static Singleton uniqueInstance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return uniqueInstance;
}
}</span></span>
通过比较两次的代码可以发现后者没有判断实例是否存在,而是直接将实例赋值给了变量uniqueInstance。这就是我们所说的“饿汉式”。大家有没有发现“饿汉式”和设置全局变量的做法存在很多相似之处。
那么什么时候用“懒汉式”?什么时候用“饿汉式”?
很显然,当我们的程序中需要经常用到单例的时候,我们就使用饿汉式。当我们的程序中偶尔用到单例的时候,我们就选择懒汉式。