最近在看Framework 系统服务的源码时,发现有个 单例模式 的经典代码,记录一下。
1. 先定义了一个抽象的单例 基类 :
package android.util;
import android.compat.annotation.UnsupportedAppUsage;
/**
* Singleton helper class for lazily initialization.
*
* Modeled after frameworks/base/include/utils/Singleton.h
*
* @hide
*/
public abstract class Singleton<T> {
@UnsupportedAppUsage
public Singleton() {
}
@UnsupportedAppUsage
private T mInstance;
protected abstract T create();
@UnsupportedAppUsage
public final T get() {
synchronized (this) {
if (mInstance == null) {
mInstance = create();
}
return mInstance;
}
}
}
显然,这里又用到了 泛型, 由它的子类 定义 具体的 类型。
同时使用的是 加了同步锁 的 单例模式
2 单例具体实现类
例如 ActivityManager.java 中 获取的 ActivityManagerService对象 (准确说是代理对象)就是一个单例, 代码如下:
package android.app;
@SystemService(Context.ACTIVITY_SERVICE)
public class ActivityManager {
/**
* @hide
*/
@UnsupportedAppUsage
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
//...省略
@UnsupportedAppUsage
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;
}
};
//...省略
}
可以看出 IActivityManagerSingleton 是一个 Singleton 具体实现类的对象(匿名类的对象),
调用 IActivityManagerSingleton.get() 实际上调用父类Singleton 的 get()方法,
当第一次调用get()时,实际会回调 子类实现的 create() 方法。
子类create()的实现方法中,方法返回值的泛型类型为 IActivityManager,而 IActivityManager最终实现是在 ActivityManagerService ,
这里通过Binder 的跨进程通信方式,返回了 AMS中的 Binder 对象, 从而使得客户端能够调用 AMS的方法。
3 总结
所以,这里单例抽象基类的作用:
(1) 提供获取单例对象的方法
(2) 声明 创建 单例对象 的 抽象方法, 具体创建过程由子类实现
(3) 提供 泛型参数,由子类 确定 单例的实际功能
网友评论