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 相关文章推荐
Prototype 学习 Prototype对象
Jul 12 Javascript
使用js 设置url参数
Jul 08 Javascript
JavaScript中如何通过arguments对象实现对象的重载
May 12 Javascript
js设置控件的隐藏与显示的两种方法
Aug 21 Javascript
jQuery同步提交示例代码
Dec 12 Javascript
JQuery标签页效果实例详解
Dec 24 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
Oct 11 Javascript
利用js获取下拉框中所选的值
Dec 01 Javascript
利用JS做网页特效_大图轮播(实例讲解)
Aug 09 Javascript
Vue中props的详解
May 16 Javascript
ES6 Map结构的应用实例分析
Jun 26 Javascript
mock.js模拟数据实现前后端分离
Jul 24 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
php实现mysql同步的实现方法
2009/10/21 PHP
discuz的php防止sql注入函数
2011/01/17 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
深入php var_dump()函数的详解
2013/06/05 PHP
Yii PHP Framework实用入门教程(详细介绍)
2013/06/18 PHP
php中生成随机密码的自定义函数代码
2013/10/21 PHP
Yii2 加载css、js 载静态资源的方法
2017/03/10 PHP
PHP实现类似题库抽题效果
2018/08/16 PHP
JS日历 推荐
2006/12/03 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
javascript 实现 原路返回
2015/01/21 Javascript
原生js结合html5制作小飞龙的简易跳球
2015/03/30 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
使用jQuery加载html页面到指定的div实现方法
2016/07/13 Javascript
jQuery实现checkbox列表的全选、反选功能
2016/11/24 Javascript
原生Javascript插件开发实践
2017/01/09 Javascript
ReactNative页面跳转Navigator实现的示例代码
2017/08/02 Javascript
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
nodejs微信开发之接入指南
2019/03/17 NodeJs
一文快速了解JQuery中的AJAX
2019/05/31 jQuery
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
探究Python中isalnum()方法的使用
2015/05/18 Python
Python3数据库操作包pymysql的操作方法
2018/07/16 Python
python匿名函数lambda原理及实例解析
2020/02/07 Python
Python爬虫程序架构和运行流程原理解析
2020/03/09 Python
Python面向对象魔法方法和单例模块代码实例
2020/03/25 Python
解决更改AUTH_USER_MODEL后出现的问题
2020/05/14 Python
西班牙网上书店:Casa del Libro
2016/11/01 全球购物
英国最大的纸工艺品商店:CraftStash
2018/12/01 全球购物
Anthropologie英国:美国家喻户晓的休闲服装和家居产品品牌
2018/12/05 全球购物
拉夫劳伦爱尔兰官方网站:Ralph Lauren爱尔兰
2020/04/10 全球购物
公交公司毕业生求职信
2014/02/15 职场文书
联欢晚会主持词
2014/03/25 职场文书
小学生纪念九一八事变演讲稿
2014/09/14 职场文书