单例模式
2016-11-28 本文已影响16人
helloKai
单例模式的实现方式:
-
构造函数私有
-
通过静态方法或枚举返回对象
-
多线程环境下也要保证单例对象只有一个
-
单例对象在反序列化时不会重新构建
1 . 懒汉模式
public class Singleton {
private static Singleton mInstance;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (mInstance == null) {
mInstance = new Singleton();
}
return mInstance;
}
}
缺点:每次调用都会消耗不必要的资源。
优点:只有在使用的时候才会实例化。
建议:不建议使用。
2 . 饿汉模式
public class Singleton {
private static Singleton mInstance = new Singleton();
private Singleton() {
}
public static synchronized Singleton getInstance() {
return mInstance;
}
}
3 . DCL(Double Check Lock)
public class Singleton {
private volatile static Singleton mInstance = null;
private Singleton() {
}
public static Singleton getInstance() {
if (mInstance == null) {
synchronized (Singleton.class) {
if (mInstance == null) {
mInstance = new Singleton();
}
}
}
return mInstance;
}
}
优点:第一次执行时才会实例化,效率高。
缺点:第一次加载慢。
建议:推荐的使用方式。
4 . 方法的改进模式
public class Singleton {
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.mInstance;
}
private static class SingletonHolder {
private static final Singleton mInstance = new Singleton();
}
}
建议:比之前三种都要好,推荐的使用方式。