单例模式

Observer Pattern

知识点一:定义

单例模式限制类的实例化次数只能为一次,浏览器的window对象就是一个单例,著名的jQuery库使用的也是Singleton单例模式

最简单的单例模式

以对象字面量创建对象的方式在JS开发中很常见。上面的对象是一个处理时间的工具库, 以对象字面量的方式来封装了一些方法处理时间格式。全局只暴露了一个timeTool对象, 在需要使用时, 只需要采用timeTool.getISODate()调用即可。

特点

优点:访问简单,容易创建
缺点:
1.  一旦该对象十分复杂,那么创建对象本身就需要一定的耗时,耗内存
1.  不支持私有变量和私有方法
let timeTool = {
  name: '处理时间工具库',
  getISODate: function() {},
  getUTCDate: function() {}
}

惰性单例模式

只有在需要使用单例时候才实例化单例,称为惰性单例。这样声明单例时候可以占用比较小的内存。

知识点二:一个单例必须要符合以下两点

  1. 该类只能有个一个实例,客户端只能够通过一个众所周知的访问入口访问

  2. 该实例可以通过子类扩展,客户端应该无需更改任何代码就可以使用该子类扩展的实例

知识点三: 单例扩展

针对第二点,上面例子getInstance更改为

知识点四: 静态实例(class实例出来的object)与 Singleton的区别,什么时候使用Singleton更有优势?

  1. 命名空间(避免使用全局变量/方法)

一个项目常常不只一个程序员进行开发和维护, 然后一个程序员很难去弄清楚另一个程序员暴露在的项目中的全局变量和方法。如果将变量和方法都暴露在全局中, 变量冲突是在所难免的。

  1. 管理模块

一个项目有不同的库实现不同的功能,例如ajax请求,使用单例模式可以用来管理代码库中的各个模块

知识点五: 使用ES6创建单例模式

  1. 使用class声明

  2. 使用ES6 module模式下 export 一个类的实例也可以实现单例模式(非惰性)

Last updated

Was this helpful?