怎么使用es6 的class 优雅地写出单例模式?

如题,目前只想到通过全局变量的模式

var instance = null;

class Cache{  
    constructor() {
        if(!instance){
              instance = this;
        }
        return instance;
      }
}

但是明显的,这个方法并不优雅,求大神指点

阅读 11.8k
4 个回答
class Cache {
  static getInstance() {
    if (!Cache.instance) {
      Cache.instance = new Cache();
    }
    return Cache.instance;
  }
}

var cache = Cache.getInstance();
class A {
    static created = false
    static instance = null

    constructor() {
        if (!A.created) {
            // doSomething
            A.instance = {}
            A.created = true
        }
        return A.instance
    }
}

需要babel支持 具体可以看 class的静态属性和实例属性

class SingletonService {
  /**
   * [instance  当前实例]
   * @type {this}
   */
  static instance;

  /**
   * [getInstance 获取单例]
   * @method getInstance
   * @return {[type]}    [description]
   */
  static getInstance(){
      if(false === this.instance instanceof this){
          this.instance = new this;
      }
      return this.instance;
  }

  /**
   * [constructor 构造]
   * @method constructor
   * @return {object}       userInfo
   */
  constructor(){

  }
}
SingletonService.getInstance()

在外面套一个闭包:

const Singleton = (function () {
    let single = void 0
    class _Singleton {
        constructor () {
            if (!single) { single = this }
            return single
        }
    }
    return _Singleton
})()

new Singleton() === new Singleton()  // true
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏