單例模式


概念
單例模式: 只有一個實例存在铣焊。通過單例模式可以保證系統(tǒng)中一個類只有一個實例而且該實例易于外界訪問逊朽,從而方便對實例個數(shù)的控制并節(jié)約系統(tǒng)的資源。

基本結構
原始型:最簡單的單例模式其實就是一個對象字面量曲伊。

var singleton = {
  prop: "value",
  method: function () {

  }
}

這種形式的單例模式叽讳,所有成員都是公開的,都可以通過singleton來訪問坟募。這樣的缺點是:單例中有一些輔助方法并不希望暴露給使用者岛蚤,如果使用者用了這些方法,然后在后面維護的時候婿屹,一些輔助方法被刪除,這樣會造成程序的錯誤推溃。

包含私有成員的單例模式

var singleton = (function () {
  var privateVar = "private";
  return {
    prop: "value",
    method: function () {
      console.log(privateVar);
    }
  }
})();

首先是一個自執(zhí)行的匿名函數(shù)昂利,在匿名函數(shù)中届腐,聲明了一個變量privateVar,返回一個對象賦值給單例對象singleton蜂奸。在匿名函數(shù)外部無法訪問到privateVar變量犁苏,它就是單例對象的私有變量,只能在函數(shù)內部或通過暴露出來的方法去訪問這個私有變量扩所。這種形式又被成為模塊模式围详。

惰性實例化
不管是直接字面量或者私有成員的單例模式,兩者都是在腳本加載時就被創(chuàng)建出來的單例祖屏,但是有時候助赞,頁面可能永遠也用不到這個單例對象,這樣會造成資源浪費袁勺。對于這種情況雹食,最佳的處理方式就是惰性加載,就是說在需要的時候才去真正實例化這個單例對象期丰,如何實現(xiàn)呢群叶?

var singleton = (function () { 
  function init() { 
    var privateVar = "private";  
    return { 
      prop: "value", 
      method: function () {  
        console.log(privateVar); 
      } 
    } 
  } 
  var instance = null;  
  return { 
    getInstance: function () {  
      if (!instance) { 
        instance = init(); 
      }  
      return instance; 
    } 
   }  
})();

首先將創(chuàng)建單例對象的代碼封裝到init函數(shù)中,然后聲明一個私有變量instance表示單例對象的實例钝荡,公開一個方法getInstance來獲取單例對象街立。
調用的時候就通過singleton.getInstance()來進行調用,單例對象是在調用getInstance的時候才真正被創(chuàng)建埠通。

總結
單例模式的好處在于對代碼的組織作用赎离,將相關的屬性和方法封裝在一個不會被多次實例化的對象中,讓代碼的維護和調試更加輕松植阴。隱藏了實現(xiàn)細節(jié)蟹瘾,可以防止被錯誤修改,還防止了全局命名空間的污染掠手。另外可以通過惰性加載提高性能憾朴,減少不必要的內存消耗。

參考文獻
http://luopq.com/2015/10/27/design-pattern-singleton/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末喷鸽,一起剝皮案震驚了整個濱河市众雷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌做祝,老刑警劉巖砾省,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異混槐,居然都是意外死亡编兄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門声登,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狠鸳,“玉大人揣苏,你說我怎么就攤上這事〖妫” “怎么了卸察?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铅祸。 經(jīng)常有香客問我坑质,道長,這世上最難降的妖魔是什么临梗? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任涡扼,我火速辦了婚禮,結果婚禮上夜焦,老公的妹妹穿的比我還像新娘壳澳。我一直安慰自己,他們只是感情好茫经,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布巷波。 她就那樣靜靜地躺著,像睡著了一般卸伞。 火紅的嫁衣襯著肌膚如雪抹镊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天垮耳,我揣著相機與錄音,去河邊找鬼遂黍。 笑死终佛,一個胖子當著我的面吹牛,可吹牛的內容都是我干的雾家。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼芯咧,長吁一口氣:“原來是場噩夢啊……” “哼敬飒!你這毒婦竟也來了带到?” 一聲冷哼從身側響起英染,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤揽惹,失蹤者是張志新(化名)和其女友劉穎晌纫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箭养,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡慕嚷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了毕泌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喝检。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖撼泛,靈堂內的尸體忽然破棺而出挠说,到底是詐尸還是另有隱情,我是刑警寧澤愿题,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布损俭,位于F島的核電站,受9級特大地震影響潘酗,放射性物質發(fā)生泄漏杆兵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一仔夺、第九天 我趴在偏房一處隱蔽的房頂上張望琐脏。 院中可真熱鬧,春花似錦缸兔、人聲如沸日裙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昂拂。三九已至,卻和暖如春蝎抽,著一層夾襖步出監(jiān)牢的瞬間政钟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工樟结, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留养交,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓瓢宦,卻偏偏與公主長得像碎连,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子驮履,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內容