kotlin: 单例模式之饿汉模式
一,功能
单例类简介 : 单例是保证在应用程序的内存中 , 只存在一个实例的设计模式 ;
① 饿汉式 : 这个类只要一声明对象 , 只要该类被调用到 , 不管有没有用到其单例对象 , 必须马上创建一个该单例对象 ( 类对象很饿 ) ;
② 懒汉式 : 声明类对象时 , 什么都不做 , 只有类获取单例对象时 , 才创建对象 ( 创建对象很懒 ) ; 只有类获取单例对象时 , 才创建对象 ;
两者的区别:
懒汉式单例模式:在第一次使用时才进行初始化,这样可以节省资源,但需要注意线程安全问题
饿汉式单例模式:在类加载时就完成了初始化,因此类加载较慢,
但由于初始化完成后无需再次初始化,所以多线程环境下是线程安全的
二,例子
object修饰的类,既是单例的实例,又是类名,又是对象
Kotlin中的object就声明了一个类为饿汉模式的单例,
经过object修饰过得类就是一个静态类,默认实现了饿汉模式
代码:
object SingleStudent {
var name = "Tom"
var age = 18
fun sayHello() {
age++
println("$name $age years old, say hello.")
}
}
调用:
//处理按钮点击事件
binding.button1.setOnClickListener {
// 调用单例类
SingleStudent.sayHello()
}
//处理按钮点击事件
binding.button2.setOnClickListener {
// 调用单例类
SingleStudent.sayHello()
}
运行结果: 轮流点击两个按钮

三,例子
可以在一个类里声明多个对象,
也可以在一个对象内部声明多个对象,用来组织单例数据
代码:
object Game {
object Properties {
val maxPlayersCount = 13
val maxGameDurationInSec = 2400
}
object Info {
val name = "My super game"
}
}
class Player(val id: Int) {
object Properties {
val defaultSpeed = 7
fun calcMovePenalty(cell: Int): Int {
return cell*10
}
}
object Factory {
fun create(playerId: Int): Player {
return Player(playerId)
}
}
}
调用:
//处理按钮点击事件:
binding.button3.setOnClickListener {
println(Player.Properties.defaultSpeed) // 7
println(Player.Factory.create(13).id) // 13
}
//处理按钮点击事件
binding.button4.setOnClickListener {
println(Game.Properties.maxGameDurationInSec)
println(Game.Info.name)
}
运行结果:第一个按钮
![]()
第二个按钮
![]()
浙公网安备 33010602011771号