定义:单例模式是最简单也是最常用的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问。不需要实例化该类的对象。
饿汉式:类的加载就会导致该单实例对象被创建
懒汉式:类的加载不会导致该单例对象被创建,而是首次使用该对象时才会被创建
//饿汉式
class Signleton{
companion object{
private val instance = Signleton() //类创建了实例就会被创建
fun getInstance() = instance //这里只是代表使用 但是对象早已创建
}
}
//饿汉式 枚举方式
enum class Singleton{
INSTANCE
}
//类的加载和对象的创建并不同时,但是创建对象的时候是一个动态的过程,如果同时有多个线程访问这个实例,这个时候实例还不存在,就会重复创建多个实例
//懒汉式 线程不安全
class Signleton{
companion object{
private var instance: Signleton? = null
fun getInstance(): Signleton{
if (instance == null)
instance = Signleton()
return instance!!
}
}
}
//懒汉式 线程安全 Kotlin中的懒汉式线程安全非常的简单 使用by lazy就好了
class Signleton{
companion object{
private val instance : Signleton by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { Signleton() }
@JvmName("getInstance1")
fun getInstance(): Signleton = instance
}
}
//懒汉式 静态内部类
//推荐使用 在没有加锁的情况下,保证了多线程下的安全,并且没有任何性能影响和空间浪费
class Signleton{
companion object{
fun getInstance() = InstanceHolder.INSTANCE
}
object InstanceHolder{
val INSTANCE = Signleton()
}
}
//Kotlin写法 线程安全,且懒汉式
object Singleton{
}
饿汉式好处:不需要线程锁之类的,性能得到的最大化
饿汉式坏处:不能在需要使用的时候创建,相比于懒汉式浪费内存
懒汉式好处:在需要使用的时候再创建对象
懒汉式坏处:因为需要加锁,所以懒汉式的性能会有损耗
tip:推荐使用静态内部类的方式,即实现了懒汉式,又没有性能损耗,是一种非常优秀的选择