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获取样式中颜色值的方法
Jan 29 Javascript
jQuery根据元素值删除数组元素的方法
Jun 24 Javascript
javascript 常用验证函数总结
Jun 28 Javascript
JS函数修改html的元素内容,及修改属性内容的方法
Oct 28 Javascript
JS实现json的序列化和反序列化功能示例
Jun 13 Javascript
20行JS代码实现网页刮刮乐效果
Jun 23 Javascript
vue小图标favicon不显示的解决方案
Sep 19 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
Mar 02 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
Aug 09 jQuery
JavaScript中join()、splice()、slice()和split()函数用法示例
Aug 24 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
Apr 10 Javascript
Vue实现小购物车功能
Dec 21 Vue.js
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教程孙仲岳主讲
2008/01/07 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
php实现生成code128条形码的方法详解
2017/07/19 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
javascript一点特殊用法
2008/05/28 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
2015/02/25 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
2015/08/24 Javascript
js通过指定下标或指定元素进行删除数组的实例
2017/01/12 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
JavaScript装饰器函数(Decorator)实例详解
2017/03/30 Javascript
JavaScript实现body内任意节点的自定义属性功能示例
2017/09/18 Javascript
package.json配置文件构成详解
2019/08/27 Javascript
JS常用排序方法实例代码解析
2020/03/03 Javascript
js实现拖拽与碰撞检测
2020/09/18 Javascript
详解ES6 中的Object.assign()的用法实例代码
2021/01/11 Javascript
[01:52]深扒TI7聊天轮盘语音出处7
2017/05/11 DOTA
python实现稀疏矩阵示例代码
2017/06/09 Python
python和ruby,我选谁?
2017/09/13 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
用django设置session过期时间的方法解析
2019/08/05 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
2019/09/20 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
python解析多层json操作示例
2019/12/30 Python
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
俄罗斯香水和化妆品网上商店:NOTINO.ru
2019/12/17 全球购物
Ado与Ado.net的相同与不同
2014/12/08 面试题
财务管理专业推荐信
2013/11/19 职场文书
小学生新学期寄语
2014/01/19 职场文书
《口技》教学反思
2014/02/21 职场文书
2014年档案管理工作总结
2014/11/17 职场文书
小学生家长意见
2015/06/03 职场文书
详解Laravel制作API接口
2021/05/31 PHP
MySQL中的隐藏列的具体查看
2021/09/04 MySQL
java如何实现获取客户端ip地址的示例代码
2022/04/07 Java/Android