一、单例模式的定义
单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建后再返回,这就确保了一个类只有一个实例对象。在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)
})()