最常見的單例Singleton設計模式,保證系統中的每一個類在任何情況例項化時候獲得的都是同一個例項。 例如:
let l1 = new Parent()
let l2 = new Parent()
l1 === l2 // true
複製程式碼
JavaScript最常見實現單例模式有一下兩種方法:
-
通過 ES6 中 proxy 代理 construct 建構函式
const singletonify = (Origin) => { let temp = new Origin return new Proxy(Origin, { construct: function(target, args, newTarget) { return temp } }) } //ps: ES6中proxy真的是神器,不僅可以替代Object.defineProperty來代理getter setter,還可以代理建構函式,apply函式執行等等方法) 複製程式碼
-
通過閉包實現
class Singleton { constructor() {} } Singleton.instance = () => { let singleInstance return () => { if(!singleInstance) { singleInstance = new Singleton() } return singleInstance } } 複製程式碼
單例設計模式優點:
1. 確保全域性唯一隻有一個例項;
2. 可以節約系統記憶體資源,由於記憶體中只存在單例一個物件例項,當在系統頻繁建立刪除物件時,可以極大節省記憶體;
3. 避免重複建立共享資源,避免了對共享資源的重複佔用。
複製程式碼
單例設計模式缺點:
1. 不能儲存彼此物件例項狀態;
2. 對單例物件的擴充套件很難,只能用於全域性共享資源等場景。
複製程式碼