美文网首页
03 Android常见设计模式:单例模式

03 Android常见设计模式:单例模式

作者: 彩虹_直至黑白 | 来源:发表于2021-12-09 16:38 被阅读0次

前言

单例是运行最广泛的设计模式之一。在应用这个模式时,单例模式的类必须保证只有一个实例存在。多用于整个程序只需要有一个实例,通常很消耗资源的类,比如线程池,网络请求,Bitmap创建,访问数据库等。由于类比较耗资源,所以没必要让它构造多个实例,这种就是单例模式比较好的使用场景。

定义

确保某一个类只有一个实例,并且自行实例化,向整个系统提供这个唯一实例。

举例

1.懒汉式(线程安全)

public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
  
    public static synchronized Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}
  • 描述:这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。
  • 优点:第一次调用才初始化,避免内存浪费。
  • 缺点:效率较低,加锁 synchronized 才能保证单例,但加锁会影响效率。
2.饿汉式

public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}
  • 描述:这种方式比较常用,但容易产生垃圾对象。
  • 优点:没有加锁,执行效率很提高。
  • 缺点:类加载时就初始化,浪费内存。
3.双重校验锁(DCL)

public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){}  
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
        }  
    }  
    return singleton;  
    }  
}
  • 描述:这种方式采用双锁机制,安全且在多线程情况下能保持高性能。该方式也是我们较为推荐的方式。
4.静态内部类

public class Singleton{

    private static class SingletonHolder {  
          private static final Singleton INSTANCE = new Singleton();  
    }  
    
    private Singleton(){}
    
    public static Singleton getSingleton(){
          return SingletonHolder.INSTANCE
    }
}

描述:这种方式能达到双检锁方式一样的功效,但实现更简单。对静态域使用延迟初始化,应使用这种方式而不是双检锁方式。这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。

5.Kotlin下的单例模式
class Singleton private constructor() {
    companion object {
        val instance: Singleton by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { Singleton() }
    }
}

    class Singleton private constructor() {//这里可以根据实际需求发生改变

        companion object {
            @Volatile private var instance: Singleton? = null
            fun getInstance(property: Int) =
                    instance ?: synchronized(this) {
                        instance ?: Singleton().also { instance = it }
                    }
        }
    }

相关文章

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

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

  • 单例模式

    JAVA设计模式之单例模式 十种常用的设计模式 概念: java中单例模式是一种常见的设计模式,单例模式的写法...

  • python之理解单例模式

    python之理解单例模式 1、单例模式 单例模式(Singleton Pattern)是一种常见的软件设计模式,...

  • 设计模式 - 目录

    设计模式01 - 单例模式 设计模式02 - 工厂模式 设计模式03 - 建造者模式 设计模式04 - 适配器模式...

  • 03 Android常见设计模式:单例模式

    前言 单例是运行最广泛的设计模式之一。在应用这个模式时,单例模式的类必须保证只有一个实例存在。多用于整个程序只需要...

  • OC中的单例

    单例,感觉挺高大上的,单例是程序中常见的一种设计模式,常用的设计模式还有代理设计模式,观察者模式等等;所谓单例就是...

  • Java设计模式—单例模式

    概念 java中单例模式是一种常见的设计模式,单例模式的写法有好几种,比较常见的有:懒汉式单例、饿汉式单例。单例模...

  • iOS单例模式

    1 单例模式 它是一种设计模式(常见的设计模式有:观察者模式、工厂模式、门面模式等)。单例设计模式中,一个类只有一...

  • Android设计模式-模版方法模式

    UML关系简单介绍UML简单使用的介绍创建型设计模式Android设计模式-单例模式Android设计模式-工厂模...

  • Android设计模式-迭代器模式

    UML关系简单介绍UML简单使用的介绍创建型设计模式Android设计模式-单例模式Android设计模式-工厂模...

网友评论

      本文标题:03 Android常见设计模式:单例模式

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