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

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

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

0. 項目地址

1. 什麼是單例模式?

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

2. 單例模式用途

若是一個類負責鏈接數據庫的線程池、日誌記錄邏輯等等,此時須要單例模式來保證對象不被重複建立,以達到下降開銷的目的。python

3. 代碼實現

須要指明的是,如下實現的單例模式均爲「惰性單例」:只有在用戶須要的時候纔會建立對象實例。git

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);
相關文章
相關標籤/搜索