摘要
单例模式主要的五种如下:
- 饿汉式
- 懒汉式
- 线程安全的懒汉式
- 双重校验锁式(Double Check)
- 静态内部类式
一、项目使用单例模式实例场景
app在运行时缓存部分数据,作为全局缓存数据,以便其他页面及时更新页面对应状态的数据,例如,个人信息、是否显示检测更新弹框等业务逻辑。这时定义一个对象并使用单例模式创建实例。
AppRunTimeCacheData实例代码
bash
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示例代码
bash
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!!
}
//线程安全的懒汉式
@Synchronized
fun 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