单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例
饿汉式
先初始化对象,类在加载内存时候创建对象1
2
3
4
5
6
7public class Single{
	private Single(){}
	private static final Single single = new Single();
	public static Single getInstance(){
		return single;
	}
}
懒汉式
方法被调用时才初始化对象,对象的延迟加载1
2
3
4
5
6
7
8
9
10public class Single{
	private static Single single = null;
	private Single(){}
	public static synchronized Single getInstance(){
		if(single == null){
			single = new Single();
		}
		return single;
	}
}
这样的懒汉模式每次调用都会同步,会影响性能,所以又产生了DCL(双重锁模式)1
2
3
4
5
6
7
8
9
10
11
12
13
14public 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的假象
内部类的单例模式
其优点在于随用随加载1
2
3
4
5
6
7
8
9
10
11
12public class InnnerClassSingle {
	private InnnerClassSingle() {	
	}
	private static class SingleHodler {
		private static final InnnerClassSingle instance=new InnnerClassSingle();
	}
	public static InnnerClassSingle getInstance() {
		return SingleHodler.instance;
	}
}
枚举单例模式
反序列化的时候只会有一个枚举生成
枚举中的属性必须放在最前面
枚举中可以和java类一样定义方法
枚举中的构造方法必须是私有的1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public enum EnumManager {
	SDCardManager(10) {
		
		public EnumManager getSingle() {
			return SDCardManager;
		}
	},
	HttpManager(1) {
		
		public EnumManager getSingle() {
			return null;
		}
	};
	public SdCardImpl getSingleton() {
		return new SdCardImpl();
	}
	
	public abstract EnumManager getSingle();
		private EnumManager(int type) {
	}
}
使用枚举中的单利1
EnumManager.SDCardManager.getSingleton();