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()
        }

运行结果: 轮流点击两个按钮

image

三,例子

可以在一个类里声明多个对象,
也可以在一个对象内部声明多个对象,用来组织单例数据

代码:

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) 
        }

运行结果:第一个按钮

image

第二个按钮

image

 

posted @ 2025-09-06 08:38  刘宏缔的架构森林  阅读(6)  评论(0)    收藏  举报