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 相关文章推荐
指定js可访问其它域名的cookie的方法
Sep 18 Javascript
RGB颜色值转HTML十六进制(HEX)代码的JS函数
Apr 25 Javascript
使用CSS和jQuery模拟select并附提交后取得数据的代码
Oct 18 Javascript
node.js中的path.normalize方法使用说明
Dec 08 Javascript
ECMAScript6函数默认参数
Jun 12 Javascript
js中开关变量使用实例
Feb 24 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
Mar 08 Javascript
JS控件bootstrap suggest plugin使用方法详解
Mar 25 Javascript
通过源码分析Vue的双向数据绑定详解
Sep 24 Javascript
vue如何在自定义组件中使用v-model
May 14 Javascript
vue-router 起步步骤详解
Mar 26 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
Jul 09 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运行SVN命令显示某用户的文件更新记录的代码
2014/01/03 PHP
小谈php正则提取图片地址
2014/03/27 PHP
php 字符串中的\n换行符无效、不能换行的解决方法
2014/04/02 PHP
PHP生成唯一订单号
2015/07/05 PHP
Save a File Using a File Save Dialog Box
2007/06/18 Javascript
jQuery 隔行换色 支持键盘上下键,按Enter选定值
2009/08/02 Javascript
js获取dom的高度和宽度(可见区域及部分等等)
2013/06/13 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
2015/04/07 Javascript
requireJS使用指南
2016/04/27 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
2016/11/12 Javascript
jQuery实现优雅的弹窗效果(6)
2017/02/08 Javascript
重新理解JavaScript的六种继承方式
2017/03/24 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
详解关于Vue版本不匹配问题(Vue packages version mismatch)
2018/09/17 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
python实现杨辉三角思路
2017/07/14 Python
Python3实现抓取javascript动态生成的html网页功能示例
2017/08/22 Python
Tensorflow模型实现预测或识别单张图片
2019/07/19 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
美国轮胎网站:Priority Tire
2018/11/28 全球购物
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
教师实习期自我鉴定
2013/10/06 职场文书
岗位竞聘演讲稿
2014/01/10 职场文书
协议书与合同的区别
2014/04/18 职场文书
高中生第一学年自我鉴定
2014/09/12 职场文书
债务追讨授权委托书范本
2014/10/16 职场文书
大学生村官工作总结2015
2015/04/09 职场文书
廉洁自律承诺书范文
2015/04/28 职场文书
2015年度企业工作总结
2015/05/21 职场文书
2016年社区综治宣传月活动总结
2016/03/16 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python
go原生库的中bytes.Buffer用法
2021/04/25 Golang
JS前端使用canvas实现物体的点选示例
2022/08/05 Javascript