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 相关文章推荐
解读IE和firefox下JScript和HREF的执行顺序
Jan 12 Javascript
javascript 极速 隐藏/显示万行表格列只需 60毫秒
Mar 28 Javascript
jquery1.83 之前所有与异步列队相关的模块详细介绍
Nov 13 Javascript
浅谈js中变量初始化
Feb 03 Javascript
JavaScript保存并运算页面中数字类型变量的写法
Jul 06 Javascript
Web前端开发工具——bower依赖包管理工具
Mar 29 Javascript
jQuery Checkbox 全选 反选的简单实例
Nov 29 Javascript
JS实现css hover操作的方法示例
Apr 07 Javascript
Vue.js在使用中的一些注意知识点
Apr 29 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
Sep 20 Javascript
微信小程序 button样式设置为图片的方法
Jun 19 Javascript
React冒泡和阻止冒泡的应用详解
Aug 18 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
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
2013/06/24 PHP
PHP通过引用传递参数用法分析
2016/12/01 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
用JavaScript事件串连执行多个处理过程的方法
2007/03/09 Javascript
JS、jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例分享
2014/04/11 Javascript
JavaScript模拟重力状态下抛物运动的方法
2015/03/03 Javascript
JavaScript事件类型中UI事件详解
2016/01/14 Javascript
node.js的事件机制
2017/02/08 Javascript
vue项目中应用ueditor自定义上传按钮功能
2018/04/27 Javascript
JS实现Cookie读、写、删除操作工具类示例
2018/08/28 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
2019/03/04 Javascript
使用react context 实现vue插槽slot功能
2019/07/18 Javascript
javascript实现商品图片放大镜
2019/11/28 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
十个Python程序员易犯的错误
2015/12/15 Python
对python numpy数组中冒号的使用方法详解
2018/04/17 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
Python 控制终端输出文字的实例
2019/07/12 Python
Python 操作 ElasticSearch的完整代码
2019/08/04 Python
python通过移动端访问查看电脑界面
2020/01/06 Python
python 制作磁力搜索工具
2021/03/04 Python
Myprotein葡萄牙官方网站:英国优质运动营养品牌
2016/09/12 全球购物
Ellesse英国官网:意大利高级运动品牌
2019/07/23 全球购物
Java如何读取CLOB字段
2013/10/10 面试题
出生医学证明样本
2014/01/17 职场文书
幼儿园教师考核制度
2014/02/01 职场文书
《春笋》教学反思
2014/04/15 职场文书
2014学校领导四风对照检查材料思想汇报
2014/09/23 职场文书
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
销售经理工作失职检讨书
2014/10/24 职场文书
雷锋观后感
2015/06/10 职场文书
想要创业,那么你做好准备了吗?
2019/07/01 职场文书
南阳市白酒市场的调查报告
2019/11/08 职场文书
Python Pandas知识点之缺失值处理详解
2021/05/11 Python
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android