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 相关文章推荐
Javascript JSQL,SQL无处不在,
May 05 Javascript
JavaScript高级程序设计 学习笔记 js高级技巧
Sep 20 Javascript
js+CSS实现弹出居中背景半透明div层的方法
Feb 26 Javascript
JavaScript使用Replace进行字符串替换的方法
Apr 14 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
Nov 16 Javascript
JSON 对象未定义错误的解决方法
Sep 29 Javascript
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
Apr 12 jQuery
JavaScript实现封闭区域布尔运算的示例代码
Jun 25 Javascript
JavaScript类的继承方法小结【组合继承分析】
Jul 11 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
Sep 21 Javascript
JavaScript 作用域实例分析
Oct 02 Javascript
Vue 电商后台管理项目阶段性总结(推荐)
Aug 22 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操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
PHP数组操作汇总 php数组的使用技巧
2011/07/17 PHP
php文件缓存类汇总
2014/11/21 PHP
yii分页组件用法实例分析
2015/12/28 PHP
PHP微信开发之有道翻译
2016/06/23 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
2018/04/21 PHP
yii2 在控制器中验证请求参数的使用方法
2019/06/19 PHP
js中巧用cssText属性批量操作样式
2011/03/13 Javascript
JQuery里选择超链接的实现代码
2011/05/22 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
javascript中Function类型详解
2015/04/28 Javascript
详解javascript跨浏览器事件处理程序
2016/03/27 Javascript
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
原生javascript实现图片放大镜效果
2017/01/18 Javascript
jQuery用户头像裁剪插件cropbox.js使用详解
2017/06/07 jQuery
详解Vue.directive 自定义指令
2019/03/27 Javascript
微信小程序中显示倒计时代码实例
2019/05/09 Javascript
Vuex的实战使用详解
2019/10/31 Javascript
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
python分析nignx访问日志脚本分享
2015/02/26 Python
python妹子图简单爬虫实例
2015/07/07 Python
Pyinstaller将py打包成exe的实例
2018/03/31 Python
Python实现爬虫抓取与读写、追加到excel文件操作示例
2018/06/27 Python
python实现tail实时查看服务器日志示例
2019/12/24 Python
Python爬虫新手入门之初学lxml库
2020/12/20 Python
美国领先的户外服装与装备用品店:Moosejaw
2016/08/25 全球购物
Halston Heritage官网:简洁的日装,稍显奢华的晚装
2018/11/20 全球购物
物业管理公司实习生自我鉴定
2013/09/19 职场文书
公司总经理岗位职责
2014/03/15 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
工厂标语大全
2014/10/06 职场文书
政风行风整改报告
2014/11/06 职场文书
先进典型发言材料
2014/12/30 职场文书
单位租车协议书
2015/01/29 职场文书
2015暑期社会实践调查报告
2015/07/14 职场文书