每天一個設計模式之單例模式

yuanxin發表於2019-02-16

博主按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前採用javascript(_靠這吃飯_)和python(_純粹喜歡_)兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 ?

  1. 網速過慢的朋友請移步《每天一個設計模式之單例模式》原文地址
  2. 歡迎來我的小站看更多幹貨 + 免費教程:godbmw.com

0. 專案地址

1. 什麼是單例模式?

單例模式定義:保證一個類僅有一個例項,並提供訪問此例項的全域性訪問點。

2. 單例模式用途

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

3. 程式碼實現

需要指明的是,以下實現的單例模式均為“惰性單例”:只有在使用者需要的時候才會建立物件例項。

3.1 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))

3.2 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);

相關文章