一、單例模式的定義
單例就是保證一個類只有一個實例,實現的方法一般是先判斷實例存在與否,如果存在直接返回,如果不存在就創建后再返回,這就確保了一個類只有一個實例對象。在JavaScript里,單例作為一個命名空間的提供者,從全局命名空間里提供一個唯一的訪問點來訪問該對象。
?
二、單例模式的作用
作用:
- 模塊間通訊。
- 系統中某個類的對象只能存在一個。
- 保護自己的屬性和方法。
注意事項:
- 注意this的使用。
- 閉包容易造成內存泄漏,不需要的趕快干掉。
- 注意new的成本。(繼承)
三、單例模式的簡單分類
主要分為:
- 簡單單例
- 具有局部變量的特殊單例
- 惰性單體
- 分支單體
/*** 普通單體* 比如:用戶登錄之后的信息可以用一個單體存儲*/
(function(){// 用來區分命名空間,并且將一組相關的屬性和方法組織到一起var UserInfo = {name: 'admin',code:'00101',deptName: 'pd',deptCode: 'PD001',getName: function() {return 'admin'}};alert(UserInfo.getName())
})()/*** 具有局部屬性的特殊單體*/
(function() {var UserInfo = (function(){// 利用閉包使單體有自己的私有局部變量var name = "";var code = "";// 請求后臺數據獲取屬性值ajaxreturn {name: name,code: code}})();alert(UserInfo.name)
})()/*** 惰性單體*/
(function(){var UserInfo = (function() {var userInfo = "";function init() {var name = "";var code = "";// 請求后臺數據獲取屬性值ajaxreturn {name: name,code: code}}return {getInstance : function() {if (userInfo) {return userinfo;} else {userInfo = init();return userInfo;}}}})();alert(UserInfo.getInstance().name);
})()/*** 分支單體* 比如:根據瀏覽器獲取不同的XHR,或者在不同的分辨率下初始化界面*/
(function() {// 獲取機器的分辨率var screenWidth = window.screen.width;var screenHeight = window.screen.height;var portalInfo = (function() {var $1280 = {info: '1,2,3,5'};var $1024 = {info: '1,2,3,5'};if(screenWidth == 1280) {return $1280;} else if (screenWidth == 1024) {return $1024;}})();alert(portalInfo.info)
})()
?