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 相关文章推荐
Mozilla中显示textarea中选择的文字
Sep 07 Javascript
formValidator3.3的ajaxValidator一些异常分析
Jul 12 Javascript
用js模拟struts2的多action调用示例
May 19 Javascript
js动态切换图片的方法
Jan 20 Javascript
深入分析Cookie的安全性问题
Mar 01 Javascript
JavaScrip调试技巧之断点调试
Oct 22 Javascript
微信小程序 常用工具类详解及实例
Feb 15 Javascript
详解Vue2 SSR 缓存 Api 数据
Nov 20 Javascript
浅谈vue单一组件下动态修改数据时的全部重渲染
Mar 01 Javascript
vue 实现通过手机发送短信验证码注册功能
Apr 19 Javascript
原生JS实现列表内容自动向上滚动效果
May 22 Javascript
node.js express框架实现文件上传与下载功能实例详解
Oct 15 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设计模式之单例模式使用示例
2014/01/20 PHP
Javascript的闭包
2009/12/31 Javascript
Javascript小技巧之生成html元素
2014/05/15 Javascript
JS对字符串编码的几种方式使用指南
2015/05/14 Javascript
JavaScript提高性能知识点汇总
2016/01/15 Javascript
对jQuary选择器的全面总结
2016/06/20 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
微信小程序 教程之列表渲染
2016/10/18 Javascript
vue中实现点击按钮滚动到页面对应位置的方法(使用c3平滑属性实现)
2019/12/29 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
[47:12]TFT vs Secret Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
python中pycurl库的用法实例
2014/09/30 Python
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
2015/05/02 Python
python查看zip包中文件及大小的方法
2015/07/09 Python
在Django的视图中使用数据库查询的方法
2015/07/16 Python
Python中shutil模块的常用文件操作函数用法示例
2016/07/05 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
2017/12/28 Python
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
Python脚本完成post接口测试的实例
2018/12/17 Python
tensor和numpy的互相转换的实现示例
2019/08/02 Python
python爬虫爬取幽默笑话网站
2019/10/24 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
2020/02/26 Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
2021/01/27 Python
CSS3样式linear-gradient的使用实例
2017/01/16 HTML / CSS
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
UGG美国官网:购买UGG雪地靴、拖鞋和鞋子
2017/12/31 全球购物
Omio俄罗斯:一次搜索公共汽车、火车和飞机的机票
2018/11/17 全球购物
俄罗斯在线手表和珠宝商店:AllTime
2019/09/28 全球购物
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
Linux的文件类型
2012/03/07 面试题
会计专业自荐信范文
2013/12/02 职场文书
实习单位接收函模板
2014/01/10 职场文书
党员剖析材料范文
2014/09/30 职场文书
党的群众路线教育实践活动党员个人剖析材料
2014/10/08 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python