单例设计模式的几种实现方法

​​​​​​1,饿汉式

1.1 直接实例化饿汉式

/**
 * 饿汉式:直接创建对象,不存在线程安全问题
 * @author lais
 *
 */
public class EHanSingle {

	//私有化构造器
	private EHanSingle(){}
	
	//私有化静态对象,并直接创建,强调单例时可以用final修饰
	private final static EHanSingle single = new EHanSingle();
	
	//提供外界获取方式
	public static EHanSingle getInstance(){
		return single;
	}
	//测试
	public static void main(String[] args) {
		EHanSingle instance1 = EHanSingle.getInstance();
		EHanSingle instance2 = EHanSingle.getInstance();
		System.out.println(instance1);
		System.out.println(instance2);
	}
}

1.2 枚举式饿汉式

/**
 * 枚举类饿汉式
 * 枚举类型:表示该对象是有限的几个,我们限定为一个,就是单例了
 * @author lais
 *
 */
public enum EHanEnum {
	//实例对象
	INSTANCE;
	
	//测试方法
	public static void main(String[] args) { 
		System.out.println(EHanEnum.INSTANCE);
		System.out.println(EHanEnum.INSTANCE);
	}
}

1.3 静态代码块饿汉式

/**
 * 静态代码块饿汉式:使用与复杂场景
 * @author lais
 *
 */
public class EHanSingle2 {

	//私有化构造器
	private EHanSingle2(){}
	
	//私有化静态对象,并直接创建
	private static final  EHanSingle2 single ;
	
	static {
		//可以在初始化对象之前进行某些初始化操作
		//例如,从外界配置文件中加载某些属性数据等
		single = new EHanSingle2();
	}
	//提供外界获取方式 
	public static EHanSingle2 getInstance(){
		return single;
	}
	//测试
	public static void main(String[] args) {
		EHanSingle2 instance1 = EHanSingle2.getInstance();
		EHanSingle2 instance2 = EHanSingle2.getInstance();
		System.out.println(instance1);
		System.out.println(instance2);
	}
}

2、懒汉式

2.1、  线程不安全的懒汉式

/**
 * 懒汉式:懒汉式存在线程安全问题
 * @author lais
 *
 */
public class LanHanSingle {
	
	private LanHanSingle(){}
	
	private static LanHanSingle single;
	
	public static LanHanSingle getInstance(){
		//可以加些判断要求
		single = new LanHanSingle();
		return single;
	}
}

2.2 线程安全的懒汉式

/**
 * 懒汉式:懒汉式存在线程安全问题
 * @author lais
 *
 */
public class LanHanSingle2 {
	
	private LanHanSingle2(){}
	
	private static LanHanSingle2 single;
	
	public static LanHanSingle2 getInstance(){
		//可以加些判断要求
		if(single == null){
			synchronized (LanHanSingle2.class) {
				if(single == null)
					single = new LanHanSingle2();
			}
		}
		return single;
	}
}

2.3 静态内部类懒汉式

/**
 * 在内部类被加载和初始化时,才创建INSTANCE实例对象
 * 静态内部类不会自动随着外部类的加载和初始化而初始化,它是单独去加载和初始化的
 * 因为是在内部类加载和初始化时,创建的,因此时线程安全的
 * @author lais
 *
 */
public class InnerSingle {

	private InnerSingle(){}
	
	private static class Inner{
		private static final InnerSingle INSTANCE = new InnerSingle();
	}
	
	public static InnerSingle getInstance(){
		return Inner.INSTANCE;
	}
}

3,总结

使用饿汉式时,枚举方式最简单

使用懒汉式时,静态内部类方式最简单

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值