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 相关文章推荐
jQuery中dequeue()方法用法实例
Dec 29 Javascript
javascript中局部变量和全局变量的区别详解
Feb 27 Javascript
JQuery中属性过滤选择器用法实例分析
May 18 Javascript
深入讲解AngularJS中的自定义指令的使用
Jun 18 Javascript
浅谈Javascript线程及定时机制
Jul 02 Javascript
jQuery学习之DOM节点的插入方法总结
Jan 22 Javascript
基于JavaScript实现类名的添加与移除
Apr 23 Javascript
微信小程序中多个页面传参通信的学习与实践
May 05 Javascript
微信小程序模版渲染详解
Jan 26 Javascript
element ui table(表格)实现点击一行展开功能
Dec 04 Javascript
JavaScript代码调试方法实例小结
Jan 05 Javascript
浅谈vant组件Picker 选择器选单选问题
Nov 04 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
关于Intype一些小问题的解决办法
2008/03/28 PHP
Yii2第三方类库插件Imagine的安装和使用
2017/07/06 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
JQuery Ajax通过Handler访问外部XML数据的代码
2010/06/01 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
jQuery版仿Path菜单效果
2011/12/15 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
基于JavaScript实现 网页切出 网站title变化代码
2016/04/03 Javascript
简单理解Vue条件渲染
2016/12/03 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
2020/12/31 Javascript
原生js实现打字动画游戏
2017/02/04 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
浅谈Angularjs中不同类型的双向数据绑定
2018/07/16 Javascript
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
详解Python3.6的py文件打包生成exe
2018/07/13 Python
使用PIL(Python-Imaging)反转图像的颜色方法
2019/01/24 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
2019/09/06 Python
python retrying模块的使用方法详解
2019/09/25 Python
Pycharm创建项目时如何自动添加头部信息
2019/11/14 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
2020/01/25 Python
python 链接sqlserver 写接口实例
2020/03/11 Python
Python多分支if语句的使用
2020/09/03 Python
Python存储读取HDF5文件代码解析
2020/11/25 Python
css3媒体查询中device-width和width的区别详解
2020/03/27 HTML / CSS
北美领先的智能产品购物网站:Wellbots
2018/06/11 全球购物
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
德国亚马逊官方网站:Amazon.de
2020/11/15 全球购物
宿舍卫生检讨书
2014/01/16 职场文书
同学聚会老师邀请函
2014/01/28 职场文书
建筑节能汇报材料
2014/08/22 职场文书
行政处罚告知书
2015/07/01 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
Python源码解析之List
2021/05/21 Python
SQL实现LeetCode(178.分数排行)
2021/08/04 MySQL
十大最强妖精系宝可梦,哲尔尼亚斯实力最强,第五被称为大力士
2022/03/18 日漫