设计模式之单例模式
1、饿汉单例模式
不管程序是否需要这个对象的实例,总是在类加载的时候就先创建好实例,理解起来就像不管一个人想不想吃东西都把吃的先买好,如同饿怕了一样。
public class LoginStateContext{
private static LoginStateContext mInstatnce = new LoginStateContext();
//禁用外部使用new来生成该类的对象
private LoginStateContext(){
}
public static LoginStateContext getInstance(){
return mInstatnce;
}
}
2、懒汉单例模式(不建议使用)
优点:单例只有在使用时才会被实例化,在一定程度上节约了资源。
缺点:第一次加载时需要及时进行实例化,反应稍慢,最大的问题是每次调用getInstance方法都进行同步,造成不必要的同步开销。
public class LoginStateContext{
private static LoginStateContext mInstatnce;
//禁用外部使用new来生成该类的对象
private LoginStateContext(){
}
public static synchronized LoginStateContext getInstance(){
if(null == mInstatnce){
mInstatnce = new LoginStateContext();
}
return mInstatnce;
}
}
3、Double Check Lock(DCL)单例模式(不赞成使用)
优点:单例既能够在需要使用时才会被实例化,又能够保证线程安全,且单例对象初始化后再次调用getgetInstance方法不进行同步锁,节省同步开销。(解决资源消耗、多余的同步、线程安全等问题)
缺点:在某些情况下出现失效的问题,这个问题被称为双重检查锁定(DCL)失效,《Java并发编程实践》一书提到过。
public class LoginStateContext{
private static LoginStateContext mInstatnce = null;
//禁用外部使用new来生成该类的对象
private LoginStateContext(){
}
public static LoginStateContext getInstance(){
if(null == mInstatnce){
synchronized(LoginStateContext.class){
if(null == mInstatnce){
mInstatnce = new LoginStateContext();
}
}
}
return mInstatnce;
}
}
4、静态内部类单例模式(推荐使用)
public class LoginStateContext{
//禁用外部使用new来生成该类的对象
private LoginStateContext(){
}
public static LoginStateContext getInstance(){
return LoginStateContextHolder.mInstatnce ;
}
//静态内部类
private static class LoginStateContextHolder{
private static final LoginStateContext mInstatnce = new LoginStateContext();
}
}
5、枚举单例模式
6、容器单例模式
来自于《Android源码设计模式解析与实践》的笔记