設(shè)計(jì)模式:單例模式

單例模式

單例(Singleton)模式的作用讓某一個(gè)類始終只擁有一個(gè)實(shí)例,即每次通過構(gòu)造函數(shù)構(gòu)造的對象始終是同一個(gè)。

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

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

單例模式的實(shí)現(xiàn)

實(shí)例掛載構(gòu)造函數(shù)

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

  // main
  this.bang = "Big";

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

優(yōu)點(diǎn):實(shí)現(xiàn)簡單
缺點(diǎn):在構(gòu)造函數(shù)上暴露了instance實(shí)例,容易被篡改

重寫構(gòu)造函數(shù)

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

  // main
  this.bang = "Big";

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

優(yōu)點(diǎn):沒有暴露任何變量
缺點(diǎn):

  1. 丟失掛載在原構(gòu)造函數(shù)和原構(gòu)造函數(shù)原型上的屬性
  2. 實(shí)例的構(gòu)造函數(shù)不等于現(xiàn)在的構(gòu)造函數(shù)

寫成代碼就是

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

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

universe.constructor === Universe; // false

這和我們預(yù)想的結(jié)果是不一致的;我們?nèi)匀幌M麊卫J降臉?gòu)造函數(shù)擁有一般構(gòu)造函數(shù)的效果;因此這個(gè)單例模式仍然要繼續(xù)優(yōu)化,這次優(yōu)化主要是放在原型問題上。我們這么做:

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

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

  // 補(bǔ)充原型
  Universe.prototype = this;
  // 構(gòu)造實(shí)例
  instance = new Universe();
  // 重置構(gòu)造函數(shù)
  instance.constructor = Universe;

  // main
  this.bang = "Big";

  return instance;
}

閉包

如果要全程維護(hù)唯一實(shí)例的生命周期,那么采用閉包應(yīng)該才是最合適的方式。

var Universe = (function () {
  var instance;

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

    instance = this;

    // main
    this.bang = "Big";
  }
})();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。 單例模式的使用很廣泛,比如:線程池(threa...
    richy_閱讀 380評論 0 0
  • 目錄 本文的結(jié)構(gòu)如下: 什么是單例模式 為什么要用該模式 模式的結(jié)構(gòu) 代碼示例 優(yōu)點(diǎn)和缺點(diǎn) 適用環(huán)境 模式應(yīng)用 總...
    w1992wishes閱讀 484評論 1 2
  • 單例模式(Singleton):在應(yīng)用這個(gè)模式時(shí),單例對象的類必須保證只有一個(gè)實(shí)例存在。許多時(shí)候整個(gè)系統(tǒng)只需要擁有...
    _SHYII閱讀 1,111評論 0 2
  • 什么是單例模式?定義:確保某一個(gè)類只有一個(gè)實(shí)例,而且可以自行實(shí)例化,并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例關(guān)鍵點(diǎn):只有一個(gè)實(shí)例,...
    小杰的快樂時(shí)光閱讀 476評論 0 0
  • 單例模式 介紹 為了節(jié)約系統(tǒng)資源,有時(shí)需要確保系統(tǒng)中某個(gè)類只有唯一一個(gè)實(shí)例,當(dāng)這個(gè)唯一實(shí)例創(chuàng)建成功之后,我們無法再...
    666真666閱讀 417評論 0 6

友情鏈接更多精彩內(nèi)容