摘要
单例模式主要的五种如下:
- 饿汉式
- 懒汉式
- 线程安全的懒汉式
- 双重校验锁式(Double Check)
- 静态内部类式
一、项目使用单例模式实例场景
app在运行时缓存部分数据,作为全局缓存数据,以便其他页面及时更新页面对应状态的数据,例如,个人信息、是否显示检测更新弹框等业务逻辑。这时定义一个对象并使用单例模式创建实例。
AppRunTimeCacheData实例代码
class AppRunTimeCacheData {//单例模式(双重校验锁式)companion object {val INSTANCE by lazy { AppRunTimeCacheData() }}var showDownLoadAppDialog: Boolean = true //是否显示下载app弹框var mLoginBean: LoginBean? = null // 用户个人信息/*** 更新用户个人信息数据*/fun setUserData(loginBean: LoginBean) {mLoginBean = loginBean}/*** 退出登录,清空运行时缓存的数据*/fun loginOut() {mLoginBean = null}}
使用AppRunTimeCacheData示例
- 在所有触发退出登录的地方统一使用示例如下
AppRunTimeCacheData.INSTANCE.loginOut()
- 在登录成功后或者获取到个人信息数据时更新缓存数据示例如下
AppRunTimeCacheData.INSTANCE.setUserData(loginBean)
SingletonKT示例代码
class SingletonKT{//饿汉式/*object SingletonKT直接将 SingletonKT 定义为 object*/companion object {// val INSTANCE = SingletonKT()private var INSTANCE: SingletonKT? = null//懒汉式get() {if (field == null) {field = SingletonKT()}return field}//懒汉式fun get(): SingletonKT {return INSTANCE!!}//线程安全的懒汉式@Synchronizedfun get2(): SingletonKT {return INSTANCE!!}//双重校验锁式(Double Check)val INSTANCE2: SingletonKT by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {SingletonKT()}//静态内部类式val INSTANCE3 = SingletonKTHolder.holder}private object SingletonKTHolder{val holder = SingletonKT()}
}
使用SingletonKT示例
SingletonKT.INSTANCE
SingletonKT.get()
SingletonKT.get2()
SingletonKT.INSTANCE3