单例模式(Singleton Design Pattern),一个类只允许创建一个对象(或者实例),这个类就是一个单例类,这种设计模式被叫做单例设计模式。

为什么要用单例?

  1. 资源访问冲突

    当我们定义一个类的时候,若在不同的对象都创建该类,那么可能存在相互覆盖的问题。通过设计成一个单例类,在程序中只允许创建一个对象,所有的线程共享使用该对象,就可以避免会互相覆盖的问题。

  2. 全局唯一类

    配置信息类等在系统只应保存一份的东西。

全局变量的比较

单例模式与全局变量,全局变量必须在程序一开始就创建好对象,如果这个对象非常消耗资源,而程序在这次执行过程中又一直没用到它,就会非常浪费资源。

利用单例模式,则在需要的时候,才创建对象。同时单例模式确保对象只会被初始化一次。

实现单例

img

用 Java 实现一个经典的单例模式

public class Singleton {
  private static Singleton uniqueInstance;

  private Singleton() {}

  public static Singleton getInstance() {
    if (uniqueInstance == null) {
      uniqueInstance = new Singleton();
    }
    return uniqueInstance;
  }
}

用 TypeScript 的 class 完成一个单例:

class Store {
  static instance;

  static getInstance() {
    if (!Store.instance) {
      Store.instance = new Store();
    }

    return Store.instance;
  }
}

单例存在的问题

  1. 单例对 OOP 特性的支持不友好
  2. 单例会隐藏类之间的依赖关系
  3. 单例对代码扩展性不友好
  4. 单例对代码的可测性不友好
  5. 单例不支持有参数的构造函数

参考链接