概述
单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。
单例模式有三个特点:
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例。
单例模式的实现主要有两种方式:饿汉式、懒汉式。
饿汉式
类被加载时,就自行创建实例。代码如下:
public class EagerSingleton {
private EagerSingleton() {} //私有构造方法
private static EagerSingleton instance = new EagerSingleton(); //创建对象,并私有化
public static EagerSingleton getInstance() { //公共的静态工厂方法,保证外界能够访问
return instance;
}
}
单例模式中一个最重要的特点是类的构造方法是私有的,从而避免外界利用构造方法直接创建出任意多的实例。值得指出的是,由于构造方法是私有的,因此此类不能被继承。
饿汉式一般多用于实际开发中。
懒汉式
类在第一次被引用时,将自己实例化。代码如下:
public class LazySingleton {
private LazySingleton () {}
private static LazySingleton instance = null;
//同步方法处理多线程问题
public synchronized static LazySingleton getInstance() {
if(instance == null) {
instacne = new LazySingleton();
}
return instance;
}
//同步代码块处理多线程问题
public static LazySingleton getInstance() {
if(instance == null) {
synchronized (LazySingleton .class) {
if(instance == null)
instance = new LazySingleton ();
}
return instance;
}
}
在上面给出的懒汉式单例模式实现里对静态工厂方法使用了同步化,以处理多线程环境。
面试的时候,一般写懒汉式实现。
总结
饿汉式单例类在自己被加载时就将自己实例化,懒汉式单例类在自己第一次被引用时将自己实例化。单从资源利用效率角度来讲,懒汉式稍好些。从速度和反应时间角度来讲,饿汉式稍好些。然而,懒汉式在实例化时,必须处理好在多个线程同时首次引用此类时的访问限制问题。