美文网首页
设计模式及在Android中的应用 - 单例模式

设计模式及在Android中的应用 - 单例模式

作者: chengjian666 | 来源:发表于2017-06-02 01:22 被阅读101次

1. 首先了解一些单例模式的概念

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
这样做有以下几个优点
• 对于那些比较耗内存的类,只实例化一次可以大大提高性能,尤其是在移动开发中;
• 保持程序运行的时候该中始终只有一个实例存在内存中
有如下经典的实现方式:

public class Singleton {
    private static volatile Singleton instance = null;

    private Singleton(){
    }

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

以上实现由如下几个十分关键的地方:

  • • 必须要将构造函数私有化,以防止外部可以调用构造函数进行实例化;
  • • 定义一个静态函数获取该实例;
  • • 定义一个全局的静态变量,并以voliate修饰;
  • • 在实例获取函数中,必须进行同步处理,并在同步块中进行双重判空;(双重判空的原因:防止外部函数在调用该获取实例的函数时,恰好有一个线程被阻塞等待,等此次创建好实例之后,那个等待的线程获取锁之后就不需要再创建该实例,因此在同步锁内进行二次判空是有必要的)。

2. 单例模式在Android中的应用

回到Android中,是有很多地方用到了单例模式的,下面举例说明:

1).EventBus中获取实例:

private static volatile EventBus defaultInstance;
public static EventBus getDefault() {
    if (defaultInstance == null) {
        synchronized (EventBus.class) {
            if (defaultInstance == null) {
                defaultInstance = new EventBus();
            }
        }
    }
    return defaultInstance;
}

该单例的实现就是标准的精简单例模式的实现;

2). InputMethodManager获取实例

static InputMethodManager sInstance;
public static InputMethodManager getInstance() {
    synchronized (InputMethodManager.class) {
        if (sInstance == null) {
            IBinder b = ServiceManager.getService(Context.INPUT_METHOD_SERVICE);
            IInputMethodManager service = IInputMethodManager.Stub.asInterface(b);
            sInstance = new InputMethodManager(service, Looper.getMainLooper());
        }
        return sInstance;
    }
}

在输入法服务实例的单例模式中,就是精简的模式,即将外部判空去除了,直接进入同步块中,当然同步块中的判空是必不可少的;
在Android中,诸如其他的系统服务如:AccessibilityManager在获取实例的时候就是采用的单例模式进行的。

3. 单例模式的自定义工具应用

应用单例模式,我们可以在创建自定义工具类来管理我们的Activity,代码示例如下:

public class ActivityManager {

    private static volatile ActivityManager instance;
    private Stack<Activity> mActivityStack = new Stack<Activity>();

    private ActivityManager(){

    }

    public static ActivityManager getInstance(){
        if (instance == null) {
            synchronized (ActivityManager.class) {
                if (instance == null) {
                    instance = new ActivityManager();
                }
            }
            return instance;
        }

    public void addActicity(Activity act){
        mActivityStack.push(act);
    }

    public void removeActivity(Activity act){
        mActivityStack.remove(act);
    }

    public void killMyProcess(){
        int nCount = mActivityStack.size();
        for (int i = nCount - 1; i >= 0; i--) {
            Activity activity = mActivityStack.get(i);
            activity.finish();
        }

        mActivityStack.clear();
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}

这个Activity的管理工具类就是一个十分典型的应用。注意,该Activity栈是归属于一个实例的,因此各个方法对该数据结构进行操作时,均是针对该实例所属的内存,因此所有的操作方法均为非静态。

最后,安利一个十分好用的Android framework源码查看网页:
androidxref.com,当前已更新到 http://androidxref.com/7.1.1_r6/, 完全免费,临时查阅很管用。

androidstudio.png

相关文章

  • Android 设计模式之简单工厂模式

    设计模式系列文章 Android 设计模式之单例模式 Android 设计模式之Builder模式 Android...

  • 单例模式

    3、单例模式(Singleton) 单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象...

  • 设计模式-单例模式(Singleton)

    单例模式(Singleton) 单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保...

  • 单例模式Singleton

    这是我在学习《Android源码设计模式解析和实战》过程中对单例模式作一个记录。方便以后随时翻看。单例模式是应用最...

  • 设计模式整理(2) 单例模式

    学习《Android 源码设计模式解析与实践》系列笔记 什么是单例 单例模式是应用最广,也是最容易理解的模式之一。...

  • 设计模式 - 单例模式

    设计模式 - 单例模式 什么是单例模式 单例模式属于创建型模式,是设计模式中比较简单的模式。在单例模式中,单一的类...

  • 设计模式及在Android中的应用 - 单例模式

    1. 首先了解一些单例模式的概念 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这样做有以下几...

  • 2、创建型设计模式-单例设计模式

    江湖传言里的设计模式-单例设计模式 简介:什么是单例设计模式和应用 备注:面试重点考查 单例设计模式:这个是最简单...

  • Android中的设计模式—单例模式

    单例模式介绍 单例模式是应用最广的模式之一,也可能是很多人唯一会使用的设计模式。在应用单例模式时,单例对象的类必须...

  • java设计模式之单例模式实例讲解

    单例模式是应用最广的模式,在开发中,如果我们想要让一个类在nvm中只有一个实例的话,就设计成单例模式,单例模式能够...

网友评论

      本文标题:设计模式及在Android中的应用 - 单例模式

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