移动架构-单例模式

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例

饿汉式

先初始化对象,类在加载内存时候创建对象

public class Single{
	private Single(){}
	private static final Single single = new Single();
	public static Single getInstance(){
		return single;
	}
}

懒汉式

方法被调用时才初始化对象,对象的延迟加载

public class Single{
	private static Single single = null;
	private Single(){}
	public static synchronized Single getInstance(){
		if(single == null){
			single = new Single();
		}
		return single;
	}
}

这样的懒汉模式每次调用都会同步,会影响性能,所以又产生了DCL(双重锁模式)

public class Single{
	private volatite static Single single = null;
	private Single(){}
	public static Single getInstance(){
		if(single == null){
			synchronized(Single.class){
				if(single == null){
					single = new Single();
				}
			}
		}
		return single;
	}
}

如果不加volatile可能会出现问题,这是由于Jdk5以后支持处理器乱序执行汇编指令,导致指向地址和实例化堆区顺序不同,这时候可能在实例化的过程中其引用已经指向堆内存了,而其地址尚未返回,这时候再做赋值的话,会造成其引用为null的假象

内部类的单例模式

其优点在于随用随加载

public class InnnerClassSingle {
	private InnnerClassSingle() {	
	}

	private static class SingleHodler {
		private static final InnnerClassSingle instance=new InnnerClassSingle();
	}

	public static InnnerClassSingle getInstance() {
		return SingleHodler.instance;
	}
}

枚举单例模式

反序列化的时候只会有一个枚举生成
枚举中的属性必须放在最前面
枚举中可以和java类一样定义方法
枚举中的构造方法必须是私有的

public enum EnumManager {
	SDCardManager(10) {
		@Override
		public EnumManager getSingle() {
			return SDCardManager;
		}
	},
	HttpManager(1) {
		@Override
		public EnumManager getSingle() {
			return null;
		}
	};

	public SdCardImpl getSingleton() {
		return new SdCardImpl();
	}
	
	public abstract EnumManager getSingle();
		private EnumManager(int type) {
	}
}

使用枚举中的单利

EnumManager.SDCardManager.getSingleton();
原文地址:https://www.cnblogs.com/cj5785/p/10664626.html