js设计模式(一)单例设计模式

586 阅读1分钟

设计模式的概念

设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 使用设计模式的目的:是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

定义

限制类的实例化次数只能是一次。 如果该实例不存在的情况下,可以通过一个方法创建一个类来实现创建类的新实例,如果实例已经存在,它会返回该对象的引用。

单例模式

ES5实现方式

采用 js 静态属性实现, 在类函数上挂载一个实例和一个获取该事例的方法

function Singleton (name) { // 对象构造方法
  this.name = name;
  this.instance = null;
}
Singleton.prototype.getName = () => { // 对象原型方法
  console.log(this.name);
}
Singleton.getInstance = (name) => { // 对象静态方法
  // 如果有实例则返回,没有则创建并返回   
  if (!this.instance) {
    this.instance = new Singleton(name);
  }
  return this.instance;
}

const instanceA = Singleton.getInstance('A')
const instanceB = Singleton.getInstance('B')
console.log(instanceA, instanceB, instanceA === instanceB); // Singleton { name: 'A' } Singleton { name: 'B' } true
// instanceA === instanceB说明第一次访问的时候创建了实例,后面每次调用获取的都是第一次创建的同一个实例

ES6实现方式

class Singleton {

  constructor (name) {
    this.name = name
    this.instance = null
  }

  getName () {
    alert(this.name)
  }

  static getInstance (name) {
    // 如果该类没有被实例化,则实例化并返回该实例
    if (!this.instance) {
      this.instance = new Singleton(name)
    }
    // 如果类被实例化,则直接返回该实例
    return this.instance
  }
}

const instanceA = Singleton.getInstance('A')
const instanceB = Singleton.getInstance('B')

console.log(instanceA, instanceB, instanceA === instanceB); // Singleton { name: 'A' } Singleton { name: 'B' } true

适用场景

  1. 需要频繁实例化然后销毁的对象。
  2. 频繁访问数据库或文件的对象。
  3. 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
  4. 全局弹窗等。