天天看點

設計模式 - 單例模式 - JavaScript

單例模式定義:保證一個類僅有一個執行個體,并提供通路此執行個體的全局通路點。

專注前端與算法的系列幹貨分享,轉載請聲明出處:原文連結: xxoo521.com

什麼是單例模式?

單例模式定義:保證一個類僅有一個執行個體,并提供通路此執行個體的全局通路點。

單例模式用途

如果一個類負責連接配接資料庫的線程池、日志記錄邏輯等等,此時需要單例模式來保證對象不被重複建立,以達到降低開銷的目的。

代碼實作

需要指明的是,以下實作的單例模式均為“惰性單例”:隻有在使用者需要的時候才會建立對象執行個體。

python3 實作

class Singleton:
  # 将執行個體作為靜态變量
  __instance = None

  @staticmethod
  def get_instance():
    if Singleton.__instance == None:
      # 如果沒有初始化執行個體,則調用初始化函數
      # 為Singleton生成 instance 執行個體
      Singleton()
    return Singleton.__instance

  def __init__(self):
    if Singleton.__instance != None:
      raise Exception("請通過get_instance()獲得執行個體")
    else:
      # 為Singleton生成 instance 執行個體
      Singleton.__instance = self

if __name__ == "__main__":

  s1 = Singleton.get_instance()
  s2 = Singleton.get_instance()

  # 檢視記憶體位址是否相同
  print(id(s1) == id(s2))           

複制

javascript 實作

const Singleton = function() {};

Singleton.getInstance = (function() {
    // 由于es6沒有靜态類型,故閉包: 函數外部無法通路 instance
    let instance = null;
    return function() {
        // 檢查是否存在執行個體
        if (!instance) {
            instance = new Singleton();
        }
        return instance;
    };
})();

let s1 = Singleton.getInstance();
let s2 = Singleton.getInstance();

console.log(s1 === s2);           

複制

掃碼關注「心譚部落格」, 專注前端與算法

目前已有前端面試、劍指Offer·JS、動畫設計、Webpack等系列專題