单例模式(Single Pattern)

2022-10-11  本文已影响0人  筱湮

说明:本文为《设计模式之禅》的阅读笔记,主要总结精华和记录自己的部分理解。文中代码部分主要由Kotlin实现。

1. 定义

Ensure a class has only one instance, and provide a global point of access to it.
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

单例模式通用类图

代码清单1 单例模式

// Kotlin中实现单例模式就比较简单,只需要定义一个object对象表达式即可,无需手动设置构造器私有化和提供全局的访问点
object Singleton {
    fun doSomething() {
        println("do some thing")
    }

    private fun readResult(): Any {
        return Singleton
    }
}


// 在Kotlin中使用Singleton
fun main(args: Array<String>) {
    println("Hello World!")
    Singleton.doSomething() // 像调用静态方法一样,调用单例类中的方法
}

代码清单2 Singleton 反编译成 Java 代码

public final class Singleton {
   @NotNull
   public static final Singleton INSTANCE;

   public final void doSomething() {
      String var1 = "do some thing";
      System.out.println(var1);
   }

   private final Object readResult() {
      return INSTANCE; // 可以看到readResult方法直接返回了INSTANCE而不是创建新的实例
   }

   private Singleton() {
   }

   static {
       // 静态代码块初始化Singleton实例
       // 只要Singleton被加载了,静态代码块就会被调用,Singleton实例就会被创建,并赋值给INSTANCE
      Singleton var0 = new Singleton();
      INSTANCE = var0;
   }
}

2. 优点

3. 缺点

4. 单例模式的使用场景

5. 注意事项

代码清单3 线程安全的懒汉式单例

class LazySingleton private constructor() {

    companion object {
        private var lazyInstance: LazySingleton? = null
            get() {
                return field ?: LazySingleton()
            }

        @JvmStatic
        @Synchronized // 添加synchronized同步锁
        fun getInstance(): LazySingleton {
            return requireNotNull(lazyInstance)
        }
    }

    fun doSomething() {
        println("do some thing")
    }
}


//在Kotlin中调用
fun main(args: Array<String>) {
    LazySingleton.getInstance()
}

6. 单例模式的扩展

需要产生固定数量对象的模式

采用有上限的多例模式,我们可以在设计时决定在内存中有多少个实例,方便系统进行扩展,修正单例可能存在的性能问题,提供系统的响应速度。例如读取文件,我们可以在系统启动时完成初始化工作,在内存中启动固定数量的reader实例,然后在需要读取文件时就可以快速响应。

附1:思维导图


单例模式(Single Pattern)

附2:代码实现 https://github.com/ooxiaoyan/singlepattern.git

上一篇 下一篇

猜你喜欢

热点阅读