博主按:《天天一個設計模式》旨在初步領會設計模式的精髓,目前採用
javascript
(靠這吃飯)和python
(純粹喜歡)兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :)javascript
單例模式定義:保證一個類僅有一個實例,並提供訪問此實例的全局訪問點。java
若是一個類負責鏈接數據庫的線程池、日誌記錄邏輯等等,此時須要單例模式來保證對象不被重複建立,以達到下降開銷的目的。python
須要指明的是,如下實現的單例模式均爲「惰性單例」:只有在用戶須要的時候纔會建立對象實例。git
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))
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);