先旨聲明:此系列文章基本就是JavaScript 設計模式與開發實踐一書的精華摘要。
定義
保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
要點
- JavaScript 是一門無類的語言,在 JavaScript 中創建對象的方法非常簡單,既然需要的是一個「唯一」的對象,沒有必要先定義一個「類」。
- 全局變量滿足單例模式的兩個條件(唯一、全局訪問),但使用時要儘量避免它帶來的命名汙染問題。解決方法包括使用命名空間、使用閉包封裝私有變量等。
- 惰性單例:只在需要的時候才創建對象實例。
- 通用的惰性單例:管理單例的邏輯是可以抽象出來的——用一個變量來標誌是否創建過對象,如果是,則在下次直接返回這個已經創建好的對象。
- 單例模式的用途遠不止創建對象,也可以控制某些操作只執行一次,操作函數返回 true 即可。
核心代碼
\\ 管理(惰性)單例的邏輯
var getSingle = function(fn) {
var result = null;
return function() {
return result || (result = fn.apply(this, arguments));
}
}
\\ 具體操作以及創建單例
var createLoginLayer = function() {
var sth = xxx;
\\ 具體操作...
return sth;
}
var createSingleLoginLayer = getSingle(createLoginLayer);
\\ 運行時調用
var loginLayer = createSingleLoginLayer();