Kotlin中的单例模式

Kotlin中的单例模式

object 静态代码块单例模式

Kotlin编译器将其转换为静态代码块的单例模式,因为static代码块中的代码,虚拟机只会执行一次,因此,它保证了线程安全的前提下,同时保证我们的INSTANCE只会被初始化一次。

缺点:不支持懒加载,不支持传参。

object Singleton {
}

借助委托实现懒加载

保证了懒加载的同时,也保证了线程安全。

object Singleton {
    val user by lazy {
        loadUser()
    }

    private fun loadUser(): User {
        return User()
    }
}

伴生对象双检查单例模式

  • @Volatiel确保了INSTANCE的可见性。
  • synchronized确保了INSTANCE的原子性。
class Singleton private constructor(name: String) {
    companion object {
        @Volatile
        private var INSTANCE: Singleton? = null

        fun getInstance(name: String): Singleton =
            INSTANCE ?: synchronized(this) {
                INSTANCE ?: Singleton(name).also { INSTANCE = it }
            }
    }
}

封装单例模式

定义抽象类模板

abstract class BaseSingleton<in P, out T> {
    @Volatile
    private var INSTANCE: T? = null

    protected abstract fun creator(param: P): T

    fun getInstance(param: P): T =
        INSTANCE ?: synchronized(this) {
            INSTANCE ?: creator(param).also { INSTANCE = it }
        }
}
class UserManager private constructor(name: String) {
    companion object : BaseSingleton<String, UserManager>() {
        override fun creator(param: String): UserManager {
            return UserManager(param)
        }
    }
}
优化
  • 将creator抽象方法修改为高阶函数的类型。
  • 使用::UserManager函数引用,引用UserManager的构造函数
abstract class BaseSingleton<in P, out T> {
    @Volatile
    private var INSTANCE: T? = null

    protected abstract val creator: (P) -> T

    fun getInstance(param: P): T =
        INSTANCE ?: synchronized(this) {
            INSTANCE ?: creator(param).also { INSTANCE = it }
        }
}
class UserManager private constructor(name: String) {
    companion object : BaseSingleton<String, UserManager>() {
        override val creator: (String) -> UserManager
        	get() = ::UserManager
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值