Android单例模式你应该知道到一切

前言

单例模式想必大家都使用过,但是也许你并不完全了解它,在这里我就来详细介绍一下所有的单例模式,及单例模式中涉及的一些细节问题。


一、单例模式的作用

保证了单利类的对象只有一个实例存在,利于协调系统整体的行为。


二、单利的模式的使用场景

确保某个类只有一个对象的场景,避免产生多个对象,消耗过多的资源,或者某种类型的对象应该只有一个。例如需要访问IO和数据库等资源时,就需要考虑使用单例模式。

三、单利模式的UML图

这里写图片描述

角色介绍:

(1)Client:客户端,即调用者
(2)Singleton:单例类

实现单利类需要注意关键点如下:

(1)构造函数不对外开放,一般为private
(2)通过一个静态方法或者枚举返回单利类的对象
(3)确保单利类的对象有且只有一个,尤其是在多线程下。
(4)确保单利类的对象在返序列化的时候不会重新构建对象。


四、单例模式的种类

单例模式主要分为以下几种

1)饿汉模式
    /***
     * 饿汉式
     *
     * 优点:多线程安全
     * 缺点:提前加载内存,占用内存。
     *
     */
    private static Singleton instance = new Singleton();
    private Singleton(){}

    public static Singleton getInstance(){
        return instance;
    }
2)懒汉模式1
    /***
     * 懒汉式
     * 
     * 优点:随用随加载
     * 缺点:多线程是不安全的
     *
     */
    private static Singleton instance = null;
    private Singleton(){}

    public static Singleton getInstance(){
        if (instance == null){
            instance = new Singleton();
        }
        return instance;
    }
3)懒汉模式2
    /***
     * 懒汉式2:方法同步
     *
     * 优点:随用随加载,多线程安全
     * 缺点:第一次加载时需要及时进行初始化,反应慢。且每次调用getInstance时都进行了同步,造成不必要的开销
     *
     */
    private static Singleton instance = null;
    private Singleton(){}

    public static synchronized Singleton getInstance(){
        if (instance == null){
            instance = new Singleton();
        }
        return instance;
    }
4)懒汉模式3

此种方法也是使用人数比较多的

    /***
     * 懒汉式3:Double Check Lock(DCL) 双检查锁
     *
     * 优点:资源利用率高,随用随加载,多线程安全,2次判空,避免不必要的同步锁,节省资源。
     * 缺点:第一次加载反应稍慢
     *
     * PS:volatile的作用:由于JDK1.5之前,JVM对于类的加载机制的问题会导致失效,在1.5之后加上此关键字可以保证DCL单利不失效。
     *
     */
    private volatile static Singleton instance = null;
    private Singleton(){}

    public static Singleton getInstance(){
        if (instance == null){
            synchronized(Singleton.class){
                if (instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
5)静态内部类的单利模式

此种单利模式,推荐使用,效果好。

    /***
     * 静态内部类的单利模式:推荐使用的模式
     *
     * 优点:多线程安全,延迟加载
     * 缺点:
     *
     */
    private Singleton(){}

    public static Singleton getInstance(){
        return SingletonHolder.instance;
    }

    /***
     * 静态内部类
     */
    private static class SingletonHolder{
        private static final Singleton instance = new Singleton();
    }
6)枚举的单利模式
    /***
     * 枚举的单例模式
     *
     * 优点:写法简单,枚举默认是线程安全,并且在任何情况下它都只有一个实例,支持反序列化。
     * 缺点:
     *
     * PS:上面几种单例模式在反序列化的时候都会生成新的对象,但是枚举不会。如果上面几种方法要想反序列化
     * 的时候也不生成新的实例就需要重写 readResolve()方法,如下:
     *
     * private Object readResolve() throws ObjectStreamException{
     * return instance;
     * }
     *
     */
    public enum SingletonEnum{
        INSTANCE;
    }
7)使用容器实现单利模式
    /***
      * 使用容器实现单例模式
      *
      * 优点:将多种单利类型放在统一的管理类中,使用使根据key获取单利对象。降低用户使用成本,也对用户隐藏了具体实现,降低耦合
      * 缺点:
      *
      */
     public class SingletonManager{
        private static Map<String,Object> objMap = new HashMap<>();

         private SingletonManager(){}
         public static void registerSingleton(String key,Object instance){
             if (!objMap.containsKey(key)){
                 objMap.put(key,instance);
             }
         }

         public static Object getSingleton(String key){
             return objMap.get(key);
         }
     }

五、结语

不关以哪种方式实现的单利模式,他们的核心都是之前说到的4点
(1)构造函数不对外开放,一般为private
(2)通过一个静态方法或者枚举返回单利类的对象
(3)确保单利类的对象有且只有一个,尤其是在多线程下。
(4)确保单利类的对象在返序列化的时候不会重新构建对象。

至于到底选择哪种单例模式,试自己项目而定。

如有错误还请指出!(^o^)/~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值