单例模式

单例模式

  • 为什么要存在单例模式:在一些特殊情况下,仅允许类产生一个实例对象,往后的操作都只对这个唯一的实例操作。
    • 产生单例模式的条件:
    • 原理:
    • 四种单例模式:
      • 懒汉式(线程不安全):
      • 饿汉式(线程不安全):
      • DCL(线程安全)
      • 枚举(线程安全):

为什么要存在单例模式:在一些特殊情况下,仅允许类产生一个实例对象,往后的操作都只对这个唯一的实例操作。

产生单例模式的条件:

1.不可被外部创建
2.限制外部访问方式
3.内部保证唯一实例

原理:

将构造器的访问权限设置为private,是的外部不可创建,创建一个私有的静态私有单例引用,创建一个静态方法用来作为外部获取实例的接口,使得不用创建对象就能调用该接口,在方法中加一个if判断,没有创建过实例时,创建实例,并存入引用,若已创建,则直接返回引用。

四种单例模式:

懒汉式,饿汉式,DCL,枚举

懒汉式(线程不安全):

	public class Lazy {
	//创建私有的静态引用保存实例
	private static Lazy lazyMan=null;
	
	//将构造器设为私有,使得不能在外部创建
	private Lazy() {
		System.out.println("懒汉式创建单例");
	}
	
	//创建一个静态的方法作为外部获取单例的接口
	public static Lazy getInstance() {
		//if语句判断实例是否已创建,如果还没创建,则创建实例,然后存入lazyMan
		if(lazyMan==null)
			lazyMan=new Lazy();
		//返回实例
		return lazyMan;
	}
}

饿汉式(线程不安全):

public class SHungry {
	////创建私有的静态引用同时创建实例对象
	private static SHungry sh=new SHungry();
	
	////将构造器设为私有,使得不能在外部创建
	private SHungry() {
		System.out.println("饿汉式创建单例!");
	}
	
	//创建一个静态的方法作为外部获取单例的接口
	public static SHungry getInstance() {
		//返回实例
		return sh;
	}
}

DCL(线程安全)

public class SingletonDoubleChecking {
	//创建私有的静态引用保存实例
	private static Lazy lazyMan=null;
	
	//将构造器设为私有,使得不能在外部创建
	private Lazy() {
		System.out.println("懒汉式创建单例");
	}
	
	//创建一个静态的方法作为外部获取单例的接口
	public static Lazy getInstance() {
		//判断实例是否已创建,若已创建,则不在创建,可使线程并行,提高效率
		if(lazyMan==null){
			synchronized(SingletonDoubleChecking.class{
				//if语句判断实例是否已创建,如果还没创建,则创建实例,然后存入lazyMan
				if(lazyMan==null)
					lazyMan=new Lazy();
			}
		}
		//返回实例
		return lazyMan;
	}
}

枚举(线程安全):

public enum SingletonEnum{
	//创建唯一实例,默认为public static final
	INSTANCE;

	public String name;

	public void doSomething(){
		System.out.println("doSomething");
	} 
}

//枚举的使用方式:
SingletonEnum.INSTANCE.doSomething();

你可能感兴趣的:(单例模式)