设计模式:单例模式

单例模式

单例(Singleton)模式的作用让某一个类始终只拥有一个实例,即每次通过构造函数构造的对象始终是同一个。

var Universe = function () {
  // ...
}

new Universe() === new Universe();

单例模式的实现

实例挂载构造函数

var Universe = function () {
  // cache命中
  if (typeof Universe.instance === 'object') {
    return Universe.instance;
  }

  // main
  this.bang = "Big";

  // cahce
  Universe.instance = this;****
  return this;
}

优点:实现简单
缺点:在构造函数上暴露了instance实例,容易被篡改

重写构造函数

var Universe = function () {
  // 缓存
  var instance = this;

  // main
  this.bang = "Big";

  // 重写
  Universe = function () {
    return this;
  }
}

优点:没有暴露任何变量
缺点:

  1. 丢失挂载在原构造函数和原构造函数原型上的属性
  2. 实例的构造函数不等于现在的构造函数

写成代码就是

var universe = new Universe();
Universe.prototype.everything = true;

console.log(universe.everything);  // undefined

universe.constructor === Universe; // false

这和我们预想的结果是不一致的;我们仍然希望单例模式的构造函数拥有一般构造函数的效果;因此这个单例模式仍然要继续优化,这次优化主要是放在原型问题上。我们这么做:

var Universe = function () {
  // 缓存
  var instance;

  // 重写
  Universe = function () {
    return instance;
  }

  // 补充原型
  Universe.prototype = this;
  // 构造实例
  instance = new Universe();
  // 重置构造函数
  instance.constructor = Universe;

  // main
  this.bang = "Big";

  return instance;
}

闭包

如果要全程维护唯一实例的生命周期,那么采用闭包应该才是最合适的方式。

var Universe = (function () {
  var instance;

  return function () {
    if (instance) {
      return instance;
    }

    instance = this;

    // main
    this.bang = "Big";
  }
})();
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 单例模式的使用很广泛,比如:线程池(threa...
    richy_阅读 321评论 0 0
  • 目录 本文的结构如下: 什么是单例模式 为什么要用该模式 模式的结构 代码示例 优点和缺点 适用环境 模式应用 总...
    w1992wishes阅读 410评论 1 2
  • 单例模式(Singleton):在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有...
    _SHYII阅读 862评论 0 2
  • 什么是单例模式?定义:确保某一个类只有一个实例,而且可以自行实例化,并向整个系统提供这个实例关键点:只有一个实例,...
    小杰的快乐时光阅读 453评论 0 0
  • 单例模式 介绍 为了节约系统资源,有时需要确保系统中某个类只有唯一一个实例,当这个唯一实例创建成功之后,我们无法再...
    666真666阅读 364评论 0 6