关于单例模式,还是不清楚何时该用单例

新手上路,请多包涵

对于设计模式中的单例模式,到底何时该用单例?
今天在Android LocalBroadcastManager本地广播见到了单例模式

public static LocalBroadcastManager getInstance(Context context) {
    synchronized (mLock) {
        if (mInstance == null) {
            mInstance = new LocalBroadcastManager(context.getApplicationContext());
        }
        return mInstance;
    }
}

有没有大神能够指点下,为何这里要用单例?

阅读 2.7k
3 个回答

个人拙见,你想用单例模式一般是以下情况

  1. 你用单例模式创建的类,你希望它的生命周期是从你创建它开始,一直保持到应用进程被杀死
  2. 你用单例模式创建的类,你希望它只有一个,不要重复创建多个
  3. 创建的代价比较大(这个是来自 微凉 的回答)

就以 LocalBroadcastManager 为例,它的工作模式是你在这个类里面注册广播接收器,再通过它来发送广播,从而注册的广播接收器可以收到这个广播。
那么如果不使用单例模式,你给对象a注册一个接收器,那么下次你new出来一个对象b,你觉得朝着对象b发广播,a还能收到吗?这就需要你获取到的永远是对象a吧?
同样,如果对象a不是静态的(或者说单例),过一会它失去引用被回收了,那么下次你怎么获取到它?
再举个例子,Application不就是典型的单例吗?

创建需要较大代价,创建后比较稳定,就可以使用单例模式,可以起到缓存的作用。和枚举有类似的地方

Android广播分为全局广播和本地广播,全局广播的管理和广播的分发都是由系统来处理的,但是本地广播是由应用程序自己管理的,因此,在应用程序的当前进程里,需要有一个不依赖于各个组件生命周期的广播管理器,用于接受注册和广播分发。

需要注意的是,如果使用了远程服务(Remote Service),那这东西就不灵了,因为远程服务相对于应用主程序,它是一个独立的进程。

依此类推,就大概可以知道什么时候该使用单例了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题