单例模式

单例模式,顾名思义就是只有一个实例。

1、单例类只能有一个实例

2、单例类必须自己创建自己的唯一实例

3、提供外部访问实例方法

一、饿汉式

package com.zzq.singleton;

/**
* 单例-饿汉式
*/
public class Person {

	// 1、静态实例对象
	private static Person singleton = new Person();

	// 2、私有构造方法
	private Person() {
	}

	//3、定义静态方法获取对象
	public static Person getInstance() {
		return singleton;
	}

}

二、懒汉式


package com.zzq.singleton;

/**
 * 单例-懒汉式
 */
public class Person {

	// 1、静态实例对象
	private static Person singleton;

	// 2、私有构造方法
	private Person() {
	}

	// 3、定义静态方法获取对象
	public static synchronized Person getInstance() {
		if (null == singleton) {
			singleton = new Person();
		}

		return singleton;
	}

}

三、双检锁/双重校验锁(DCL,即 double-checked locking)

package com.zzq.singleton;

/**
* 单例-懒汉式(双检锁/双重校验锁)
*/
public class Person {

	// 1、静态实例对象
	// volatile 1、可见性,直接读取主内存   2、禁止指令重排序
	private static volatile Person singleton;

	// 2、私有构造方法
	private Person() {
	}

	//3、定义静态方法获取对象
	public static Person getInstance() {
		if(null == singleton){
			synchronized(Person.class){
				if(null == singleton){
					/**
					 * 新建对象
					 * 1、开辟内存空间
					 * 2、初始化成员变量
					 * 3、对象引用赋值给栈中的变量
					 */
					singleton = new Person();
					
				}
			}
			
			
		}
		
		return singleton;
	}

}

四、静态内部类


package com.zzq.singleton;

/**
 * 单例-静态内部类
 */
public class Person {

	// 1、静态内容部类
	private static class SingletonHandler{
		private static final Person SINGLETON = new Person();
	}

	// 2、私有构造方法
	private Person() {
	}

	// 3、定义静态方法获取对象
	public static final Person getInstance() {
		return SingletonHandler.SINGLETON;
	}

}

五、枚举


package com.zzq.singleton;

/**
 * 单例-枚举
 */
public enum Person {

	INSTANCE;

}

参考 https://www.runoob.com/design-pattern/singleton-pattern.html

你可能感兴趣的:(设计模式)