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 相关文章推荐
nullJavascript中创建对象的五种方法实例
May 07 Javascript
button没写type=button会导致点击时提交
Mar 06 Javascript
JavaScript通过字典进行字符串翻译转换的方法
Mar 19 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
Aug 18 Javascript
教你一步步用jQyery实现轮播器
Dec 18 Javascript
vue组件与复用详解
Apr 08 Javascript
vue实现简单的MVVM框架
Aug 05 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
Sep 07 Javascript
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
Sep 19 Javascript
QRCode.js二维码生成并能长按识别
Oct 16 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
Nov 28 Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
Mar 14 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加密解密的代码
2007/07/16 PHP
php绘图中显示不出图片的原因及解决
2014/03/05 PHP
教你在PHPStorm中配置Xdebug
2015/07/27 PHP
PHP常用设计模式之委托设计模式
2016/02/13 PHP
PHP缓冲区用法总结
2016/02/14 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
2016/04/12 PHP
PHP微信公众号自动发送红包API
2016/06/01 PHP
利用php的ob缓存机制实现页面静态化方法
2017/07/09 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
JavaScript的eval JSON object问题
2009/11/15 Javascript
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
说说JSON和JSONP 也许你会豁然开朗
2012/09/02 Javascript
jquery实现checkbox全选全不选的简单实例
2013/12/31 Javascript
js实现的map方法示例代码
2014/01/13 Javascript
JavaScript实现将文本框的值插入指定位置的方法
2015/08/13 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
2015/08/24 Javascript
jQuery基于BootStrap样式实现无限极地区联动
2016/08/26 Javascript
利用js获取下拉框中所选的值
2016/12/01 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
2017/03/30 Javascript
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)
2020/01/14 Javascript
python模拟事件触发机制详解
2018/01/19 Python
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
pytorch torch.expand和torch.repeat的区别详解
2019/11/05 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
2020/02/13 Python
Python requests模块session代码实例
2020/04/14 Python
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
美国知名的隐形眼镜电商:Contacts America
2019/11/19 全球购物
实习教师自我鉴定
2013/09/27 职场文书
保安拾金不昧表扬信
2014/01/15 职场文书
先进人物事迹材料
2014/12/29 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书
货款欠条范本
2015/07/03 职场文书
MySQL CHAR和VARCHAR该如何选择
2021/05/31 MySQL