移动架构之单例模式

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

饿汉式

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

1
2
3
4
5
6
7
public 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
10
public 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
14
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的假象

内部类的单例模式

其优点在于随用随加载

1
2
3
4
5
6
7
8
9
10
11
12
public 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
22
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) {
}
}

使用枚举中的单利

1
EnumManager.SDCardManager.getSingleton();

Donate comment here