首页 > 其他分享 >Kotlin设计模式之单例模式

Kotlin设计模式之单例模式

时间:2024-12-07 09:00:53浏览次数:10  
标签:Kotlin object private instance 线程 单例 fun 设计模式

一. 使用object关键字

Kotlin提供了object关键字来直接创建单例对象,这是最简单和推荐的方式。

// SingletonObject.kt
object SingletonObject {
    fun doSomething() {
        println("Doing something...")
    }
}

二. 使用companion object

companion object可以用于在类中创建单例实例。

// SingletonCompanion.kt
class SingletonCompanion private constructor() {
    companion object {
        private var instance: SingletonCompanion? = null

        fun getInstance(): SingletonCompanion {
            if (instance == null) {
                instance = SingletonCompanion()
            }
            return instance!!
        }
    }

    fun doSomething() {
        println("Doing something...")
    }
}

三. 使用lazy初始化

使用lazy委托属性来实现线程安全的单例模式。

// SingletonLazy.kt
class SingletonLazy private constructor() {
    companion object {
        val instance: SingletonLazy by lazy { SingletonLazy() }
    }

    fun doSomething() {
        println("Doing something...")
    }
}

四. 双重检查锁定(Double-Checked Locking)

这种方式在Kotlin中不常用,因为Kotlin的lazy已经提供了线程安全的实现。

// SingletonDoubleChecked.kt
class SingletonDoubleChecked private constructor() {
    companion object {
        @Volatile
        private var instance: SingletonDoubleChecked? = null

        fun getInstance(): SingletonDoubleChecked {
            return instance ?: synchronized(this) {
                instance ?: SingletonDoubleChecked().also { instance = it }
            }
        }
    }

    fun doSomething() {
        println("Doing something...")
    }
}

五. 使用Synchronized关键字

这种方式确保线程安全,但性能不如lazy。

// SingletonSynchronized.kt
class SingletonSynchronized private constructor() {
    companion object {
        private var instance: SingletonSynchronized? = null

        @Synchronized
        fun getInstance(): SingletonSynchronized {
            if (instance == null) {
                instance = SingletonSynchronized()
            }
            return instance!!
        }
    }

    fun doSomething() {
        println("Doing something...")
    }
}

总结

  • object关键字:最简单和推荐的方式,线程安全。
  • companion object:适用于需要在类中创建单例的情况。
  • lazy初始化:提供线程安全的单例实现。
  • 双重检查锁定:提供线程安全的单例实现,但在Kotlin中不常用。
  • Synchronized关键字:确保线程安全,但性能不如lazy。

根据具体需求选择合适的单例实现方式。

标签:Kotlin,object,private,instance,线程,单例,fun,设计模式
From: https://blog.csdn.net/fulai00/article/details/144192503

相关文章

  • 掌握设计模式之工厂方法模式
    工厂方法模式工厂方法模式(FactoryMethodPattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定要实例化的具体类。工厂方法模式将对象的创建委托给子类,从而实现了类的实例化延迟和高内聚低耦合的目标。工厂方法模式的结构工厂方法模式通常包含以下几个角色......
  • 17 设计模式之组合模式(公司员工结构案例)
    一、组合模式的定义        组合模式(CompositePattern)是一种结构型设计模式,它让我们可以将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式允许客户端以统一的方式对待单个对象和对象集合。它适用于表示具有层次关系的对象结构。        组合模......
  • 设计模式学习思路二
            设计模式的学习思路_设计模式必须按顺序进行吗-CSDN博客以下是一些方法和思路可以帮助你更清晰地识别使用了哪种设计模式。1.确定模式时的思考步骤        以下是分析代码时,你可以遵循的一些思路和步骤,帮助你识别可能使用的设计模式:a.识别类和对......
  • Android studio出现uplicate class kotlin.time.jdk8.DurationConversionsJDK8Kt foun
    Android编译KotlinSDK依赖包类重复冲突问题1、问题问题:gradle同步可以成功,但是编译运行时,出现以下异常。2、分析取以上内容中的一条进行分析可以看到在模块org.jetbrains.kotlin:kotlin-stdlib:1.8.20和org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21中存在重复的......
  • Java-19 深入浅出 MyBatis - 用到的设计模式 源码剖析 代理设计模式
    点一下关注吧!!!非常感谢!!持续更新!!!大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html目前已经更新到了:MyBatis(正在更新)代理模式概念介绍代理模式(ProxyPattern):给某一个对象提供一个代理,并由代理对象控制对原对象的引用,代理模式的英文名字叫Prox......
  • 15 设计模式之抽象工厂模式(支付系统案例)
    一、什么是抽象工厂模式        抽象工厂模式(AbstractFactoryPattern)是创建型设计模式之一,用于提供一个接口,用来创建一系列相关或相互依赖的对象,而不需要指定它们具体的类。        抽象工厂模式允许客户端通过工厂接口来创建一系列相关的产品对象,而无需知......
  • 设计模式开门之单例模式
    单例模式归属于设计模式大类(创建型、结构型、行为型)设计模式中的创建型模式。一个类只允许创建一个对象(实例)那么这个类就是单例类,这个设计模式就是单例设计模式。单例设计模式的这个类提供了一种访问其唯一对象的方式,可以直接访问,不需要实例化该对象,提供了一个全局访问点来访问该......
  • 掌握设计模式之简单工厂模式
    简单工厂模式简单工厂模式(SimpleFactoryPattern)是一种创建型设计模式,它定义了一个工厂类,该类可以根据传入的参数决定创建哪种产品类的实例。简单工厂模式将对象的创建逻辑封装在一个工厂类中,客户端只需要通过工厂类获取实例,而不需要直接涉及实例化的细节。简单工厂模式包含三......
  • 设计模式之生成器模式
    目录1.简介2.结构3.使用场景4.实例5.优缺点6.与其他模式的关系7.总结1.简介        生成器模式(BuilderPattern)是一种创建型设计模式,它允许你通过一步一步构建复杂对象,而不是通过一个包含大量参数的构造函数或方法。该模式特别适用于需要生成的对象具有多个......
  • 设计模式浅说
    通过翻一些源码,以及在项目里看到一些不太有强业务关联的内容使用了不少设计模式,当然也有一些内容为了设计模式而丢失了可读性,导致旁人看代码时很难理清当时什么情况什么场景什么原因什么需求什么业务逻辑等。所以在此简要铺开一下设计模式,先知道有什么,看到时知道怎么回事,遇到问题......