美文网首页
Android 设计模式 - 源码 之 单例模式

Android 设计模式 - 源码 之 单例模式

作者: 行走中的3卡 | 来源:发表于2022-03-18 10:33 被阅读0次

    最近在看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) 提供 泛型参数,由子类 确定 单例的实际功能

    相关文章

      网友评论

          本文标题:Android 设计模式 - 源码 之 单例模式

          本文链接:https://www.haomeiwen.com/subject/kdjidrtx.html