6种Kotlin中单例模式写法,特点及应用场景指南

单例模式是设计中最常用的一种设计模式,Kotlin中怎么实现的呢?

一、前言

Kotlin 中实现单例模式有多种方式,每一种方式有其特定的使用场景和意义。单例模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这在很多情况下都非常有用,比如配置管理、线程池管理等。我们只有真确的掌握了它才能更好的应用。

以下是Kotlin中6种单例模式的完整实现代码、核心特点及典型应用场景:

‌二、对象声明(饿汉式,单例模式一) ‌

kotlin 复制代码
object Singleton {
    fun doWork() { //处理相关逻辑 }
}

特点‌:

  • 它是线程安全的,它的初始化在JVM类加载时静态初始化
  • 在使用的时候立即加载,无延迟初始化
  • 代码最简洁(Kotlin原生支持)

场景‌:全局配置管理、轻量级工具类(如日志工具),常见的XXUtils类

‌三、懒加载伴生对象(单例模式二) ‌

kotlin 复制代码
class Singleton private constructor() {
    companion object {
        val instance: Singleton by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
            Singleton() 
        }
    }
}

这里需要说明的是 :单例模式即全局只能调那一个单例,是不能自己通过正向方式初始化出来的。什么意思:即是上面代码构造函数 private constructor() ,是这样限制的,不允许外部直接调用构造函数初始化的,所以正向上保证了全局只有一个。后面的所有单例模式构造函数都是这样限制的。

那反向上能不能调用构造?,既然正向上保证了不全局不能调用构造,这样全局只有一个。那么反向上:采用反射方式可以调用啊?这里需要理解的是,反射调用,是反向可以搞破坏的,这是应用层自身没法限制的。因为从搞破坏的方向出发,再怎么限制都能搞破坏,只是难易程度不同而已。

特点‌:

  • 首次调用时初始化:即延迟加载
  • 默认线程安全,使用SYNCHRONIZED模式内部使用双重锁校验来保证线程安全
  • 支持自定义线程安全模式(如NONE用于单线程)

场景‌:资源密集型对象:如数据库连接池、网络服务,XXX框架的初始化(因为全局只有初始化一次)


‌四、双重校验锁(DCL)(单例模式三) ‌

kotlin 复制代码
class Singleton private constructor() {
    companion object {
        @Volatile private var instance: Singleton? = null
        
        fun getInstance(): Singleton {
            return instance ?: synchronized(this) {
                instance ?: Singleton().also { instance = it }
            }
        }
    }
}

特点‌:

  • 高性能线程安全,它仅首次创建时同步
  • 显式控制实例化流程
  • 避免无用同步开销
  • 支持可以在首次初始化中传入相关参数:比如: fun getInstance(param:String)

场景‌:高频访问的缓存服务、性能敏感型模块

五、静态内部类(单例模式四) ‌

kotlin 复制代码
class Singleton private constructor() {
    private object Holder {
        val INSTANCE = Singleton()
    }
    
    companion object {
        val instance = Holder.INSTANCE
    }
}

特点‌:

  • 从JVM上,保证延迟加载及线程安全,是以类加载机制的形式来保证
  • 无显式同步锁,性能更优
  • 可兼容Java旧版本环境

场景‌:IO密集型服务初始化如:文件解析器

六、枚举单例 (单例模式五) ‌

kotlin 复制代码
enum class Singleton {
    INSTANCE;
    
    fun doWork() { /* 业务逻辑 */ }
}

特点‌:

  • 这样是绝对单例:它是以JVM防止反射攻击和序列化破坏来保证绝对单例
  • 线程安全且代码简洁
  • 天然支持序列化和反序列化安全

场景‌:安全性要求高的模块,如权限控制器

‌七、Map容器管理多例(单例模式六) ‌

kotlin 复制代码
class SingletonManager {
    private val instances = ConcurrentHashMap<Class<*>, Any>()
    
    inline fun <reified T> getInstance(): T {
        return instances.getOrPut(T::class.java) {
            T::class.java.getDeclaredConstructor().newInstance()
        } as T
    }
}

Android 系统源码里面获取各种Service服务就是这种设计的单例模式:

  1. 在Android系统源码的 SystemServiceRegistry

2. 我们找到它的注册服务方法 registerService

3. 通常我们调用的:getSystemService(String name),就是如下这里

特点‌:

  • 统一管理多类单例示例,比如有100多个单例,按照前面的写法得写上重复的100多次
  • 动态扩展性强(新增单例无需修改管理器)
  • 线程安全,用ConcurrentHashMap保障线程安全

场景‌:插件系统、服务注册中心、多配置管理器

八、总结

本文重点介绍了6种Kotlin中单例模式的写法,特点及应用场景

感谢阅读:

欢迎用你发财的小手 关注,点赞、收藏

这里你会学到不一样的东西

相关推荐
架构师老Y16 小时前
013、数据库性能优化:索引、查询与连接池
数据库·python·oracle·性能优化·架构
Kel16 小时前
PydanticAI 源码深潜:类型安全依赖注入与图执行引擎的双核架构解析
人工智能·python·架构
十有八七16 小时前
OpenHarness 架构说明文档
人工智能·架构
时寒的笔记16 小时前
js逆向7_案例惠nong网
android·开发语言·javascript
贵慜_Derek16 小时前
Managed Agents 里,Harness 到底升级了什么?
人工智能·算法·架构
Tadas-Gao17 小时前
从“驯马”到“驭队”:Harness Engineering 如何重构 AI 产品化的底层逻辑
人工智能·语言模型·架构·大模型·llm·harness
wasp52017 小时前
从 Vibe Coding 到真·生产力:OpenHarness 的“Harness 方程式”及其实战分析
人工智能·架构·开源·agent
OpenCSG17 小时前
OpenClaw × AgenticHub 架构解析:智能体系统如何真正具备执行能力
架构
卷卷说风控17 小时前
Claude Code 技术架构深扒:Prompt / Context / Harness 三维设计实践
人工智能·架构·prompt
肯多洛夫斯基17 小时前
安卓工控屏静默连WiFi全攻略
android