`
dengzhangtao
  • 浏览: 677624 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android设计模式系列(3)--SDK源码之单例模式

 
阅读更多

单例模式,可以说是GOF的23种设计模式中最简单的一个。
这个模式相对于其他几个模式比较独立,它只负责控制自己的实例化数量单一(而不是考虑为用户产生什么样的实例),很有意思,是一个感觉上很干净的模式,本人很喜欢这个模式。
android中很多地方都用到了单例模式,本文以输入法管理者InputMethodManager为例,展开分析。
单例模式,Singleton Pattern,能够以其特有的优势,替代系统中全局变量,应用非常广泛。

1.意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
热门词汇:单例 唯一 私有构造

2.结构

android中有很多系统级别的全局变量,如时间,输入法,账户,状态栏等等,android中对这些都直接或者有些间接用到了单例模式。
以输入法为例,把上图修改为实际情况:


非常的简单,但是有一点,从上面我们也看到了synchronized关键字,在多线程的环境下,单例模式为了保证自己实例数量的唯一,必然会做并发控制。
类似这种线程安全的单例,跨进程的单例,参数化的单例等等的情况,确实超出本文的范围,而且都涉及到很多东西,是一个很大的话题,不好展开。

3. 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public final class InputMethodManager {
    static final Object mInstanceSync = new Object();//同步
    //内部全局唯一实例
    static InputMethodManager mInstance;
 
    //对外api
    static public InputMethodManager getInstance(Context context) {
        return getInstance(context.getMainLooper());
    }
     
    /**
     * 内部api,供上面的外部api调用
     * @hide 系统隐藏的api
     */
    static public InputMethodManager getInstance(Looper mainLooper) {
        synchronized (mInstanceSync) {
            if (mInstance != null) {
                return mInstance;
            }
            IBinder b = ServiceManager.getService(Context.INPUT_METHOD_SERVICE);
            IInputMethodManager service = IInputMethodManager.Stub.asInterface(b);
            mInstance = new InputMethodManager(service, mainLooper);
        }
        return mInstance;
    }
}

  客户端调用,比如contextimpl中的getSystemService()方法中如下调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class ContextImpl extends Context{
    @Override
    public Object getSystemService(String name) {
        if (WINDOW_SERVICE.equals(name)) {
            //... ... 省略下面n个if,else if
        } else if (INPUT_METHOD_SERVICE.equals(name)) {
            //获取输入法管理者唯一实例
            return InputMethodManager.getInstance(this);
        else if (KEYGUARD_SERVICE.equals(name)) {
             //... ... 省略下面n个if,else if
        } else if (ACCESSIBILITY_SERVICE.equals(name)) {
            //又见单例,无处不在
            return AccessibilityManager.getInstance(this);
        } else if (LOCATION_SERVICE.equals(name)) {
            //... ... 省略下面n个if,else if
        else if (NFC_SERVICE.equals(name)) {
            return getNfcManager();
        }
        return null;
    }
}

  非常简单,干净的一个模式。

4.效果
(1).创建型模式。
(2).对唯一实例的受控访问。
(3).避免全局变量污染命名空间。
(4).允许对操作和表示的精化。
(5).比类操作更灵活。 

分享到:
评论

相关推荐

    Android高级应用源码-一键锁屏功能源码.zip

    10. **代码组织和设计模式**: 分析源码的结构,可以学习到良好的代码组织方式,比如模块化、面向对象设计,以及可能用到的设计模式,如单例模式、观察者模式等。 通过研究这个源码,开发者不仅可以掌握一键锁屏的...

    android源码 jar包

    5. **学习设计模式**:Android源码中广泛应用了设计模式,如观察者模式、单例模式等,阅读源码能提升开发者的设计能力。 总之,"android源码 jar包" 是一个宝贵的资源,它能够帮助进阶的Android开发者提升技能,...

    Android 万年历源码.zip

    源码中可能运用了单例模式、观察者模式等设计模式,如单例的ContentProvider实例,观察者模式用于监听日历事件的变化。 12. **UI交互**: 通过OnClickListener、OnTouchListener等接口,实现用户点击、滑动等交互...

    Android SDK开发物超所值的几本好书2

    通过分析Android源码,这本书揭示了系统内部的设计模式和最佳实践,帮助开发者提高代码质量和可维护性。它涵盖了单例模式、工厂模式、观察者模式以及MVC、MVP和MVVM架构模式。 6. 《安卓艺术探索》 这本书关注于...

    Android设计模式系列之工厂方法模式

    此外,Android SDK源码中也有许多策略模式、适配器模式、单例模式等设计模式的应用。 6. **总结** 工厂方法模式在Android开发中扮演着重要的角色,它提供了一种灵活的方式来创建对象,同时保持了代码的解耦和可...

    应用源码之51CTO下载-自定义锁屏实现----仿正点闹钟.zip

    - 源码可能包含单例模式、观察者模式、工厂模式等设计模式,这对于理解和优化代码结构至关重要。 通过对这些关键知识点的学习,开发者不仅能理解这个自定义锁屏应用的工作原理,还能提升Android应用开发的能力。...

    MJAndroid应用开发书的源码【源代码】

    - Android开发中常用的设计模式包括单例模式、工厂模式、观察者模式等,源码分析可以帮助理解如何在实际项目中应用这些模式。 12. **第三方库** - 开发者常使用第三方库如ButterKnife(视图注入)、Retrofit...

    安卓Android源码——LumaQQ- qq 代码.zip

    源码中会体现出各种设计模式的应用,如单例模式、工厂模式、观察者模式等,它们帮助代码结构清晰,易于维护。 9. **Android框架扩展** LumaQQ可能使用了第三方库,如RxJava进行响应式编程,Dagger进行依赖注入,...

    Android安卓开发经典设计学习例程源代码-WallpaperManagerSample.rar

    WallpaperManagerSample.rar”中的源码,通过分析WallpaperManagerSample,我们将探讨如何利用Android系统的WallpaperManager服务来设置和管理壁纸,以及在这个过程中涉及到的设计模式和技术要点。 ...

    Android开会计时软件源码

    5. **设计模式**:标签中提到了"优秀设计模式",源码可能采用了单例模式、观察者模式或者MVC(模型-视图-控制器)、MVVM(模型-视图-ViewModel)等架构模式,以提高代码的可读性和可维护性。 6. **事件监听**:用户...

    安卓Android源码——Android高级应用源码和思维导图.zip

    - **设计模式**:识别并理解源码中使用的常见设计模式,如单例、工厂、观察者等。 - **问题解决**:通过阅读和分析他人的代码,提高解决问题的能力,遇到类似问题时能更快找到解决方案。 总之,这个压缩包对于希望...

    Android应用源码之(游戏视图与系统组件.zip

    8. **游戏设计模式**: - 观察者模式用于事件处理,如按键事件、触摸事件。 - 单例模式用于管理全局资源,如音乐播放器、网络连接等。 - 工厂模式用于动态创建游戏对象。 以上就是“Android应用源码之(游戏视图...

    Android Tools4U源码.rar

    源码中可能运用了多种设计模式,如单例模式、工厂模式、观察者模式等,这些模式在解决特定问题时能提高代码的可读性和可维护性。此外,源码还可能展示了如何有效地管理内存,避免内存泄漏,以及如何优化UI性能,提升...

    android api sources 源码

    - **学习设计模式**:Android源码中广泛运用了各种设计模式,如单例、工厂、观察者等,这对于提升编程技巧很有帮助。 - **自定义实现**:对于Android的一些默认行为不满意,可以基于源码进行定制和扩展。 4. **...

    4000套Android源码

    你可以看到每个功能是如何通过代码实现的,了解各种设计模式的实际应用,比如单例模式、工厂模式等。此外,还可以学习到如何进行单元测试,确保代码的健壮性。更重要的是,通过对比不同解决方案,你可以形成自己的...

    Java和Android开发学习指南源码(第二版)

    12. **最佳实践和设计模式**:源码可能还会涉及一些Android开发的最佳实践,比如单例模式、MVP或MVVM架构模式的应用。 通过研究`budi-kurniawan-java4android2-examples-1d5a9b6ffc21`这个压缩包中的源码,开发者...

    Android应用源码讯飞语音测试源码.zip

    在阅读源码时,关注类的设计模式,如单例模式(用于管理SDK实例)、观察者模式(用于事件回调)等,这些都是Android开发中的常见设计模式。同时,注意代码的结构和组织,了解如何通过模块化和组件化来提高代码的...

    安卓开发-安卓冒险游戏源码可直接运行类似于精灵快跑这种可做毕业设计.zip

    这篇文档将深入解析《安卓开发-安卓冒险游戏源码可直接运行类似于精灵快跑这种可做毕业设计》的源码,旨在为安卓开发者提供一份详细的学习指南,特别是对于那些正在寻找毕业设计项目的同学。我们将讨论游戏开发的...

    java毕业设计之基于android的学生选课系统设计与实现源码.zip

    常见的设计模式如单例模式、工厂模式、观察者模式等可能会在项目中体现,有助于理解软件架构和模块化设计。 6. **文件组织与命名规范**:“java环境说明.docx”可能是关于如何配置和设置Java开发环境的文档,而...

Global site tag (gtag.js) - Google Analytics