单例模式在android开发中使用非常频繁,我们经常会在某个类中需要获取当前的Application对象,或者是之前创建的某个Activity等,单例模式提供了方便快速的获取方法,而且避免了重复创建对象实例而引起的其他错误。单例模式通常有以下四种方式:
1.饿汉模式(好奇怪的名字)
public class MyClass {
private static final MyClass mInstance = new MyClass();
private MyClass(){}
public static MyClass getInstance(){
return mInstance;
}
}
关键点:a.构造函数私有,使得外部不能随意创建对象 b.用私有的静态变量来存储创建的实例c.用公共的静态方法返回该实例
2.懒汉模式
public class MyClass{
private static MyClass mInstance;
private MyClass(){}
public static synchronized MyClass getInstance(){
if(mInstance == null){
mInstance = new MyClass();
}
return mInstance;
}
}
这种方法与上一种的差异是添加了synchronized关键字,并且在必要的时候才创建对象实例。其实synchronized关键字的主要用途是在多线程的情况下,对代码块进行保护,因为多个线程同时对某个对象实例进行修改,会产生错误。该关键字主要是用来 简化之前的Lock/Condition方式,然而官方不建议采用这样的方式来处理加锁,而是java.util.concurrent包中的阻塞队列。该方法每次都要进行同步,也是浪费资源的。
3.二重检查锁模式
public class MyClass{
private static MyClass mInstance = null;
private MyClass(){}
public static MyClass getInstance(){
if(mInstance == null){
synchronized(MyClass.class){
if(mInstance == null){
mInstance = new MyClass();
}
}
}
return mInstance;
}
}
这种方法只在首次创建对象实例的时候才同步锁,比上一种方法更高效一些。
4.采用静态内部类
public class MyClass{
private MyClass(){}
public static MyClass getInstance(){
return MyInnerClass.mInstance;
}
private static class MyInnerClass{
private static final MyClass mInstance = new MyClass();
}
}
这种方法只在调用getInstance()方法的时候才初始化对象实例,而且线程安全。