Skip to content

单例模式 #7

@impeiran

Description

@impeiran

单例模式的定义:

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

实现单例模式的常用做法:

  1. 使用一个私有属性作标识,存放已经创建的实例。
  2. 构造方法里进行判断:已有实例则返回,无则创建。
  3. 判断时需要考虑多线程异步的情况,保证线程资源的安全。

如果在前端领域里,就不必考虑多线程的情况了。比较经常用到单例的有DialogToast框,例如:用户登录弹框、单次奖品弹框。

针对上述的要点,用JS我们可以用闭包模拟私有属性,奉承单一职责的原则,可以构建一个工厂函数,用于将正常的类加工成单例模式的类。

function singleton (target) {
  let _instance = null

  const _wrapper = function singletoned () {
    if (_instance) {
      return _instance
    } else {
      const ins = Object.create(target.prototype)
      _instance = target.apply(ins, arguments) || ins
      return _instance
    }
  }

  return _wrapper
}

上述代码没有直接用new来创建实例,我们直接用方法模拟new的实现,这样就可以用传递动态参数。

使用方法:

class Target {
  constructor () {
    this.name = 'target' + Date.now()
  }

  say () {
    console.log(this.name)
  }
}

const SingleTarget = singleton(Target)

new SingleTarget().say()
new SingleTarget().say()
new SingleTarget().say()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions