单例模式是什么
首先,单例模式是设计模式的一种,是对类的编写的一种模式规范。具体到单例模式,
通俗说,例就是实例,就是对象;单就是一,代表唯一。所以说,单例模式,就是该类仅能有一个实例化对象的设计模式。
较全面的说,单例模式即使保证在整个应用程序的生命周期中的任意时刻,单例模式类的实例都只存在不超过一个(一个或者不存在)。
单例模式实现基础
知道了单例模式的基本含义,接着需要探讨实现单例类的基础,也就是怎样的设计可以实现这样的模式。
可参考如下对单例类的描述:单例模式在类中保存了它唯一的实例,同时它还提供了一个访问该唯一实例的全局方法。
在该描述中,我们获得了以下要点:
- 单例类在内部保留了它唯一的实例
- 单例类向外界提供了访问这个唯一实例的全局方法
就这两点方法,我们便可以展开分析(事实上,下文不同的写法也正是围绕着这两点进行修正。):
内部保留唯一实例
这个要点实际上需要完成两点:
1.外部不能进行实例化。
2.内部需要实例化一个私有对象
第一点,外部不能对该类进行实例化,是单例类唯一实例的根本保证。那么让外界不能对一个类进行实例化,可以采取的一种设计是让外界在进行实例化时无法调用构造方法,即将构造方法定义为私有。这样一来外部便不能在new后调用与类同名的构造方法产生实例。消除外部实例化可能性,完成!
第二点,单例类内部需要有一个实例化对象。对于这个对象,由于这个对象被类所独有,所以对象访问级别为私有;由于该类不能在外部产生对象,所以作为成员的这个对象不能是一般的成员变量,它必须为静态变量。
综上,解决这两点问题,需要
1.单例类的构造方法需要为私有
2.单例类内需要包含一个该类的静态私有变量
(对于静态内部类的写法,可将成员变量放入内部静态类中)
提供全局方法获得实例
这里,同样是由于该类不能被外部实例化对象,所以刚方法仅能通过类直接访问。所以,该方法应该是静态全局的,同时返回类型为该单例类类型
(笔者个人理解:由于涉及到线程安全和多线程下的效率问题,不同的实现方法主要就在这获得实例上斗智斗勇。)
实现单例模式
单例类的实现方法有很多。这里,仅列举六种写法:
1.饿汉式写法,静态成员变量
/*单例模式,饿汉式写法1-静态常量*/
public class Singleton1 {
private static Singleton1 uniqueInstance = new Singleton1();
private Singleton1(){
}
public static Singleton1 getInstance()
{
return uniqueInstance;
}
}
最基本的写法,在定义静态常量同时完成实例化,获得对