JavaScript设计模式--ES6实现单例模式的两种方法

680 阅读2分钟

首先我们要知道单例模式不是代码,而是一种思想,所以我们要根据思想写出代码

定义:确保只有一个实例,并且能够自行实例化,同时并向整个系统提供实例。 也就是说它只能实例化一次,并且是自己实例的,然后对外提供一个全局的访问点

优点

  1. 由于单例模式在内存中只有一个实例,减少了内存的开支,同时也减少了性能开销
  2. 避免资源的多重占用
  3. 能设置全局访问点,优化资源访问和共享

缺点

  1. 单例模式扩展困难,若要扩展,除了修改代码基本上没有第二种方法,当然要根据开发环境而定
  2. 单例模式对测试不利,因为只有单例运行完才能进行测试,中途是不能测试的
  3. 单例默认容易与单一职责起冲突(单一职责:一个类,方法...对应一个职责)

单例模式在高并发情况下需要注意线程同步情况,当然JavaScript是单线程编程语言,所以可以忽略

代码实现:创建一个类,进行类实例化时,判断类实例对象是否存在,存在则返回实例对象,不存在则创建类实例对象,多次调用实例化方法,返回的都是同一个实例对象

实现一:

let CreateSingleTon = (function (){
  let instance = null
  return class {
    constructor(name) {
      if(instance) return instance
      this.name = name
      return instance = this
    }
  }

})()

let p1 = new CreateSingleTon("李雷")
let p2 = new CreateSingleTon("韩梅梅")

console.log(p1===p2)

代码中定义了一个CreateSingleTon变量来管理和控制类和类的实例化,我们可以使用new关键字来操创建实例对象,但是违反了单一职责

这里有两个职责:

  1. 类的创建
  2. 类的实例化 CreateSingleTon控制了这两个职责,

实现二:

class  CreateSingle {
  constructor(name,age) {
    this.age = age
    this.name = name
  }
}

let MyCreateSingleTon = (function (){
  let instance
  return class {
    constructor() {
      if (instance) return instance
      return instance = new CreateSingle(...arguments)
    }
  }
})()

var p11 = new MyCreateSingleTon("李雷",12)
var p22 = new MyCreateSingleTon("韩梅梅",12)

console.log(p11===p22)

代码中把类分开创建,MyCreateSingleTon只控制了实例化,符合了单一职责

我js菜鸡一名,不对的欢迎喷!!!