前端设计模式(单例) | 青训营

93 阅读3分钟

什么是设计模式

1、模式:

  • 模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案。
  • 软件模式:在一定条件下的软件开发问题及其解法。
  • 设计模式是在特定环境下为解决某一通用软件设计问题提供的一套定制的解决方案,该方案描述了对象和类之间的相互作用。为了可重用代码、让代码更容易被他人理解、提高代码可靠性,提升软件设计的质量。

单例模式

1、动机

软件系统中有一些特殊的类,必须保证其在系统中只存在一个实例,才能保证其逻辑正确性和良好效率(比如只需要一个任务管理器,不管窗口弹出几个,内容都一样,重复对象会浪费资源。)

2、定义

确保一个类只有一个实例,并提供一个容易的全局访问点来访问这个唯一实例。

  • 如何保证一个类只有一个实例并且这个实例易于被访问?
    • 全局变量:可确保对象随时都可以被访问,但不能防止创建多个对象
    • 让类自身负责创建和保存它的唯一实例,并保证不能创建其他实例,它还提供一个访问该实例的方法
  • 必须自行创建这个实例--->(构造函数私有+静态成员变量,防止别人擅自创建实例)
  • 必须自行向整个系统提供这个实例--->(全局访问点)

3、结构

Singleton(单例)

  • 私有构造函数:确保用户无法通过new直接实例化它
  • 静态私有变量:唯一实例
  • 静态公有的工厂方法:检验实例是否已经存在,不存在才实例化自己,保存在静态私有变量中,确保实例的唯一性

4、分类

饿汉:类被加载时实例化,定义静态变量的时候直接实例化单例类,懒汉,第一次被引用时才实例化自己

  • 饿汉式单例类:无须考虑多个线程同时访问的问题;调用速度和反应时间优于懒汉式单例;资源利用效率不及懒汉式单例;系统加载时间可能会比较长。 image.png
  • 懒汉式单例类:第一次引用才实例化自己,实现了延迟加载,无需一直占用资源;但是必须处理好多个线程同时访问的问题;需通过双重检查锁定等机制进行控制,将导致系统性能受到一定影响。 image.png

5、TS代码举例

//饿汉单例模式
class SoundManager{
  static Instance = new SoundManager();
  private constructor(){}
}
SoundManager.Instance


//上面的方法在一开始就创建好了单例,但是使用可能是只是最后使用一次,因此一直占用内存很不划算
//懒汉单例模式:不用的时候先声明,用的时候再实例化
class SoundManager{
  private static instance:SoundManager;
  static Instance(){
    //当前单例是否产生
    //懒加载
    if(!SoundManager.instance){
        SoundManager.instance=new SoundManager();
    }
    new SoundManager();
  }
  private constructor(){}
}

SoundManager.Instance()