先看一个案例,非单例模式的案例:
描述Dog对象:
package cn.kotlin.kotlin_oop08 class Dog(var name:String, var color:String) { /** * 显示狗狗的名字 */ fun showDogName() { println("狗狗的名字是:${this.name}") } /** * 显示狗狗的颜色 */ fun showDogColor() { println("狗狗的颜色是:${color}") } }
main测试:
package cn.kotlin.kotlin_oop08 fun main(args: Array<String>) { /** * Dog("小白", "纯白色") 相当于Java中的 new Dog("小白", "纯白色"); */ var dog1 = Dog("小白", "纯白色") dog1.showDogName() dog1.showDogColor() println("----------------------") /** * Dog("小黑", "黑色") 相当于Java中的 new Dog("小黑", "黑色"); */ var dog2 = Dog("小黑", "黑色") dog2.showDogName() dog2.showDogColor() println("----------------------") /** * 以上代码 由于实例化了 两次Dog() 所以他们的引用肯定是不一样的,所以打印false */ println(dog1 == dog2) /** * 实例化对象10次 * 以下代码相当于Java中 new Dog() 10次 */ Dog("参数1", "参数2") Dog("参数1", "参数2") Dog("参数1", "参数2") Dog("参数1", "参数2") Dog("参数1", "参数2") Dog("参数1", "参数2") Dog("参数1", "参数2") Dog("参数1", "参数2") Dog("参数1", "参数2") Dog("参数1", "参数2") }
执行结果:
以上的 (非单例模式的案例),每当执行Dog() ,就会实例化一个对象,如果多次调用,或者 多个地方调用,会多次实例化,所以需要采用当例模式(只实例化一次)
单例模式案例
描述Dog对象 把class Dog { 修改成>> object Dog { 后 颜色变成黄色了:
把class Dog { 修改成>> object Dog { 后 就属于单例模式了,只实例化一次
package cn.kotlin.kotlin_oop08 /** * 把class Dog { 修改成了>> object Dog { 后 在JVM中只会实例化一次,可以理解为当例模式 */ object Dog { var name:String = "" var color:String = "" /** * 显示狗狗的名字 */ fun showDogName() { println("狗狗的名字是:${name}") } /** * 显示狗狗的颜色 */ fun showDogColor() { println("狗狗的颜色是:${color}") } }
main测试:
package cn.kotlin.kotlin_oop08 fun main(args: Array<String>) { var dog1 = Dog dog1.name = "小白" dog1.color = "纯白色" dog1.showDogName() dog1.showDogColor() println("----------------------") var dog2 = Dog dog2.name = "小黑" dog2.color = "黑色" // dog2.showDogName() // dog2.showDogColor() // 也可以这样调用方法 Dog.showDogName() Dog.showDogColor() println("----------------------") /** * 以上代码 由于只实例化了1次Dog() 所以他们的引用肯定是一样的,所以打印true */ println(dog1 == dog2) /** * 永远实例化对象一次 */ Dog Dog Dog Dog Dog Dog Dog Dog Dog Dog }
执行结果: