简单说来,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)。它有两种实现:饿汉式单例和懒汉式单例。
懒汉式单例:
何为懒汉式单例呢,可以这样理解,单例模式呢,其在整个应用程序的生命周期中只存在一个实例。懒汉式呢,就是这个单例类的这个唯一实例是在第一次使用 getInstance()时实例化的,如果您不调用 getInstance()的话,这个实例是不会存在的,即为 null。形象点说呢,就是你不去动它的话,它自己是不会实例化的,所以可以称之为懒汉。
public class Singleton {
//1、私有化构造方法
private Singleton(){}
//2、创建私有的全局静态(通过类方法调用)对象
private static Singleton instance;
//3、编写外部获取对象的方法
public static Singleton getInstance(){
if (instance == null) {
return instance = new Singleton();
}
return instance;
}
}
从上面的这个 getInstance()中可以看出这个单例类的唯一实例是在第一次调用 getInstance()时实例化的,
所以此为懒汉式单例,但是懒汉模式的单例是线程不安全的(可以通过对对象加锁来实现多线程同步)。
饿汉式单例:
上面介绍了饿汉式单例,到这里来理解懒汉式单例的话,就容易多了,懒汉式单例由于人懒,所以其自己是不会主动实例化单例类的唯一实例的,而饿汉式的话,则刚好相反,其由于肚子饿了,所以到处找东西吃,人也变得主动了很多,所以根本就不需要别人来催他实例化单例类的为一实例,其自己就会主动实例化单例类的这个唯一类。
public class Singleton {
//1、私有化构造方法
private Singleton(){}
//2、创建私有的全局静态(通过类方法调用)对象
private static Singleton instance = new Singleton();
//3、编写外部获取对象的方法
public static Singleton getInstance(){
return instance;
}
}
上面的饿汉式单例类中可以看到,当整个类被加载的时候,就会自行初始化 singleton 这个静态只读变量。而非在第一次调用 GetInstance()时再来实例化单例类的唯一实例,所以这就是一种饿汉式的单例类。饿汉模式的单例是多线程安全的,因为在类加载的时候就已经初始化好了对象,调用的时候不需要再创建,也就没有多线程创建一说。
好,到这里,就真正的把单例模式介绍完了,在此呢再总结一下单例类需要注意的几点:
一、单例模式是用来实现在整个程序中只有一个实例的。
二、单例类的构造函数必须为私有,同时单例类必须提供一个全局访问点。
三、单例模式在多线程下的同步问题和性能问题的解决。
四、懒汉式和饿汉式单例类。