单例模式可以算是所有设计模式中用的最多也最好理解的一种设计模式了,还记得当初刚刚入门那会,去面试,有一道笔试题就是手写“饿汉式”和“懒汉式”两种单例模式的代码。
废话不多说,直接上代码:
饿汉式
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return INSTANCE;
}
}
懒汉式(双重校验)
public class Singleton {
private static volatile Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
以上这两种是常用的写法,那天,我在阅读ActivityManager源码的时候,以下代码引起了我的注意:
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
从名字我们也知道,这应该是一种单例模式,其关键就在于Singleton这个类,找了一下,这个类是在android.util包下的,但属于隐藏类,我们无法直接使用,但是我们可以copy一份出来嘛:
public abstract class Singleton<T> {
private volatile T mInstance;
protected abstract T create();
public final T get() {
if (mInstance == null) {
synchronized (this) {
if (mInstance == null) {
mInstance = create();
}
return mInstance;
}
}
return mInstance;
}
}
代码也很好理解,这就是上面说的懒汉式(双重校验),然后用泛型进行抽象封装,方便使用,挺好的一个工具类!
事实证明,耐心地阅读源码总会有意外收获的,共勉之!
网友评论