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

Android 设计模式之单例设计模式

作者: 没有了遇见 | 来源:发表于2022-07-13 14:04 被阅读0次

    简介

    单例设计模式(Singleton Pattern),属于创建型模式,它提供了一种创建对象的方式.单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例

    意图

    保证一个类仅有一个实例,并提供一个访问它的全局访问点,

    优缺点

    1.优点

    • 内存中只有一个对象,减少内存开销
    • 所有对象都访问唯一实例;
    • 因为单一实例,可以达到数据共享,再不同的线程直接共享

    2.缺点

    • 由于单例模式中没有抽象层,扩展性差

    实现

    懒汉式:调用方法才创建对象

    1.1 懒汉式,线程不安全
    这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。

    package com.wkq.interview.util;
    
    import android.util.Log;
    
    /**
     * @author wkq
     * @date 2022年07月13日 13:28
     *
     * @des
     *  模式:单例设计模式-懒汉式(未加锁)
     *  这种方式 lazy loading
     *  缺点:很明显,未加锁不要求线程安全,在多线程不能正常工作。
     */
    
    public class LazyNoLockSingletonPatternUtil {
    
       private static LazyNoLockSingletonPatternUtil instance;
    
        public static LazyNoLockSingletonPatternUtil getInstance() {
            if (instance == null) instance = new LazyNoLockSingletonPatternUtil();
            return instance;
        }
    
        public void doIt() {
            Log.e("执行了:", "SingletonPattern");
        }
    }
    
    

    1.2 懒汉式 线程安全(加锁 synchronized )

    package com.wkq.interview.util;
    
    import android.util.Log;
    
    /**
     * @author wkq
     * @date 2022年07月13日 13:28
     * @des 模式:单例设计模式-懒汉式(加锁)
     * 这种方式 lazy loading
     * 缺点:加锁,线程调用安全。
     */
    
    public class LazyLockSingletonPatternUtil {
    
        private static LazyLockSingletonPatternUtil instance;
    
        public static synchronized  LazyLockSingletonPatternUtil getInstance() {
            if (instance == null) {
                instance = new LazyLockSingletonPatternUtil();
            }
    
    
            return instance;
        }
    
        public void doIt() {
            Log.e("执行了:", "SingletonPattern");
        }
    }
    
    

    1.3 双检锁/双重校验锁

    package com.wkq.interview.util;
    
    import android.util.Log;
    
    /**
     * @author wkq
     * @date 2022年07月13日 13:28
     * @des 模式:单例设计模式-懒汉式(加锁)
     * 这种方式 lazy loading
     * 缺点:加锁,线程调用安全。
     *
     * synchronized 同步锁 同一时刻修改加锁的对象只能有一个线程得到执行,另一个线程阻塞,执行完之后等待线程才能执行
     *
     * volatile 多个线程访问同一变量情况下确保不会出错,不能保证线程安全
     */
    
    public class DoubleLockSingletonPatternUtil {
        // 锁 1
        private volatile  static DoubleLockSingletonPatternUtil instance;
    
        public static DoubleLockSingletonPatternUtil getInstance() {
            if (instance == null) {
                // 锁 2
                synchronized(DoubleLockSingletonPatternUtil.class){
                    instance = new DoubleLockSingletonPatternUtil();
                }
            }
    
    
            return instance;
        }
    
        public void doIt() {
            Log.e("执行了:", "SingletonPattern");
        }
    }
    
    

    2.饿汉式

    package com.wkq.interview.util;
    
    import android.util.Log;
    
    /**
     * @author wkq
     * @date 2022年07月13日 13:28
     * @des 模式:单例设计模式-懒汉式(加锁)
     * 这种方式 lazy loading
     * 缺点:线程不安全 一调用就加载 浪费内存
     */
    
    public class HungrySingletonPatternUtil {
    
        private volatile  static HungrySingletonPatternUtil instance =new HungrySingletonPatternUtil();
    
        public static  HungrySingletonPatternUtil getInstance() {
            return instance;
        }
    
        public void doIt() {
            Log.e("执行了:", "SingletonPattern");
        }
    }
    
    

    相关文章

      网友评论

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

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