javascript 单例/单体模式(Singleton)


Posted in Javascript onApril 07, 2011

单例模式的三个特点:
1,该类只有一个实例
2,该类自行创建该实例(在该类内部创建自身的实例对象)
3,向整个系统公开这个实例接口
Java中大概是这个样子

class Singleton { 
//私有,静态的类自身实例 
private static Singleton instance = new Singleton(); 
//私有的构造子(构造器,构造函数,构造方法) 
private Singleton(){} 
//公开,静态的工厂方法 
public static Singleton getInstance() { 
return instance; 
} 
}

使用时
Singleton obj = Singleton.getInstance();

这个单例类在自身被加载时instance会被实例化,即便加载器是静态的。因此,对于资源密集,配置开销较大的单体更合理的做法是将实例化(new)推迟到使用它的时候。即惰性加载(Lazy loading),它常用于那些必须加载大量数据的单体。修改下
class LazySingleton { 
//初始为null,暂不实例化 
private static LazySingleton instance = null; 
//私有的构造子(构造器,构造函数,构造方法) 
private LazySingleton(){} 
//公开,静态的工厂方法,需要使用时才去创建该单体 
public static LazySingleton getInstance() { 
if( instance == null ) { 
instance = new LazySingleton(); 
} 
return instance; 
} 
}

使用方式同上。
单例模式是Javascript最基本,最有用的模式之一。它提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码通过单一的变量进行访问。
单体在Javascipt中有许多用处,可以用来划分命名空间,以减少全局变量的泛滥。还可以用在分支技术中用来处理各浏览器的差异。
Javascript中单例模式的实现方式有多种,每一种都有自身的优点或缺点。
1,对象直接量实现最基本,最简单的单体
var Singleton = { 
attr1 : 1, 
attr2 : 'hello', 
method1 : function(){alert(this.attr2);}, 
method2 : function(arg){} 
}

这种方式中,对象所有成员都通过Singleton加点号访问。所有成员是公开的,没有私有的。在执行到变量Singleton时,会加载(实例化)自身,即非惰性加载。
此外method1用this访问单体的其它成员会存在一些风险,因为method1的上下文不是总是指向Singleton对象。
比如当把method1作为事件监听器时,this可能指向的是dom元素,这时可能会提示undefined。
2,闭包实现私有成员的单体
var Singleton = function(){ 
var attr = 1, fn = function(){}; 
return { 
method : function(){ fn(); }, 
getAttr : function(){ return attr; } 
}; 
}();

这种方式中var定义私有的成员属性attr,方法fn,然后返回一个公开的接口method和getAttr。今后修改实现时,接口方法method和getAttr不变,只需修改私有的attr和fn的具体实现。使用如下
Singleton.method(); 
Singleton.getAttr();

3,闭包实现私有成员的惰性实例化单体
var LazySingleton = function(){ 
var attr = 1, fn = function(){}; 
var obj = { 
method : function(){ fn(); }, 
getAttr : function(){ return attr; } 
}; 
function init(){ 
return obj; 
} 
return {getInstace: init}; 
}();

适用场合上面已经提到:对于那些必须加载大量数据的单体直到需要使用它的时候才实例化。使用方式是这样的
LazySingleton.getInstance().method(); 
LazySingleton.getInstance().getAttr();
Javascript 相关文章推荐
实现连缀调用的map方法(prototype)
Aug 05 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
Jun 16 Javascript
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
Jun 24 Javascript
JS常见问题整理(持续更新)
Aug 06 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
Jan 09 Javascript
JavaScript bold方法入门实例(把指定文字显示为粗体)
Oct 17 Javascript
JS数组(Array)处理函数整理
Dec 07 Javascript
AngularJS表单基本操作
Jan 09 Javascript
input输入密码变黑点密文的实现方法
Jan 09 Javascript
js实现1,2,3,5数字按照概率生成
Sep 12 Javascript
深入理解Promise.all
Aug 08 Javascript
JS获取表格视图所选行号的ids过程解析
Feb 21 Javascript
Safari5中alert的无限循环BUG
Apr 07 #Javascript
JQuery中html()方法使用不当带来的陷阱
Apr 07 #Javascript
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
Apr 07 #Javascript
jQuery为iframe的body添加click事件的实现代码
Apr 07 #Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
Apr 07 #Javascript
Jquery Ajax的Get方式时需要注意URL地方
Apr 07 #Javascript
jquery对表单操作2
Apr 06 #Javascript
You might like
饭制《星际争霸》Mod:优化游戏机制 增加新单位
2017/07/02 星际争霸
汉字转化为拼音(php版)
2006/10/09 PHP
php实现从ftp服务器上下载文件树到本地电脑的程序
2009/02/10 PHP
PHP 显示客户端IP与服务器IP的代码
2010/10/12 PHP
Views rows style模板重写代码
2011/05/16 PHP
CI框架自动加载session出现报错的解决办法
2014/06/17 PHP
ThinkPHP模板判断输出Present标签用法详解
2014/06/30 PHP
PHP实现ftp上传文件示例
2014/08/21 PHP
php使用curl简单抓取远程url的方法
2015/03/13 PHP
BOOM vs RR BO5 第二场 2.14
2021/03/10 DOTA
javascript 简练的几个函数
2009/08/29 Javascript
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
IE6下CSS图片缓存问题解决方法
2010/12/09 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
2013/07/22 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
浅析BootStrap栅格系统
2016/06/07 Javascript
React中使用collections时key的重要性详解
2017/08/07 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
2020/09/09 Javascript
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
python 自动提交和抓取网页
2009/07/13 Python
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
python 如何去除字符串头尾的多余符号
2019/11/19 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
便利店促销方案
2014/02/20 职场文书
小学生家长寄语
2014/04/02 职场文书
教师党员学习群众路线心得体会
2014/11/04 职场文书
保证书格式
2015/01/16 职场文书
英语邀请函范文
2015/02/02 职场文书
开学典礼校长致辞
2015/07/29 职场文书
Nginx配置Https安全认证的实现
2021/05/26 Servers
详细介绍python类及类的用法
2021/05/31 Python