一、定义

保证一个类只有一个对象实例,并提供一个统一的访问方式。有以下三个特点:

  1. 此类只能有一个实例
  2. 此类需要自行创建这个实例
  3. 此类对整个系统提供这个实例

二、类图表示

单例模式

三、实现

1、懒汉式

package pattern.creational.singleton.lazy;

public class Singleton {

	private static Singleton instance;
	
	private Singleton() {}
	
	public synchronized static Singleton getInstance(){
		if(instance == null){
			instance = new Singleton();
		}
		return instance;
	}
}

  • 优点:

    实例对象是在获取实例(getInstance)时才被初始化,不会浪费内存。

  • 缺点:

    getInstance方法使用了synchronized线程同步关键字,执行效率会降低。

2、饿汉式

package pattern.creational.singleton.hungry;

public class Singleton {

	private static Singleton singleton = new Singleton();
	
	private Singleton() {}
	
	public static Singleton getInstance(){
		return singleton;
	}
}

  • 优点:

    getInstance方法没有线程同步synchronized关键字,执行效率高。

  • 缺点:

    在类初始化时就初始化了singleton实例对象,可能会产生内存的浪费。

3、双重检查

package pattern.creational.singleton.doublecheck;

public class Singleton {

	private static volatile Singleton instance;
	
	private Singleton() {}
	
	public static Singleton getInstance(){
		if(instance == null){
			synchronized(Singleton.class){
				if(instance == null){
					instance = new Singleton();
				}
			}
		}
		return instance;
	}
}

四、使用

Singleton singleton = Singleton.getInstance();

五、适用场合

系统中某个类的对象实例只需要有一个的时候。