javascript 设计模式之单体(Singleton)模式
2014-04-13 22:34
288 查看
单体模式介绍
单体模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”javascript是一个没有类的程序语言,当然也可以去模拟面向对象语言的类式写法。对于javascript我们广义的去理解单体模式。
javascript的单体模式可以带来哪些作用那?首先肯定是减少了全局变量数目,javascript的全局变量是该语言的糟糕特性之一,作为一个优秀的JS程序员一定要控制全局变量的使用。其次我们把一组相关的逻辑单元组织在一个单体中,用来划分命名空间,这样使得代码可读性更强更好维护。
下面我们学习javascript的单体模式,我们以浏览器类型和版本为模型进行实例。
单体模式示例
简单的单体模式
最简单的单体模式实现,使用{}将相关属性方法组织起来。var Browser = { type : 'Firefox', version : '3.6', getType : function(){return this.type;}, getVersion : function(){return this.version;} }; console.log(Browser.getType()); console.log(Browser.getVersion()); console.log(Browser.type);
我们已经实现了最简单是单体模式,但是此时的单体模式很脆弱,如果有人写下如下的代码,那么我们的单体就被破坏了。
var Browser = { type : 'Firefox', version : '3.6', getType : function(){return this.type;}, getVersion : function(){return this.version;} }; console.log(Browser.getType()); console.log(Browser.getVersion()); Browser.type = 'change'; console.log(Browser.getType()); console.log(Browser.getVersion());
此时的输出内容在的类型已经被改变掉了。我们的浏览器类型可以随意改变,这显然不行的了。我们需要使用私有成员来进行这个单体模式的变形。那么我们可以使用闭包来完成私有成员的处理。
使用闭包的单体模式
var Browser = (function(){ var type = 'Firefox'; var version = '3.6'; function _getType(){return type;} function _getVersion(){return version;} return { getType:function(){return _getType();}, getVersion:function(){return _getVersion();} } })(); console.log(Browser.getType()); console.log(Browser.getVersion()); console.log(Browser.type);
此时外面已经访问不到 Browser内部的类型与版本。下面我们继续升级,这次我们升级到只有使用的时候才去实例化Browser。
惰性实例化单体模式
var Browser = (function(){ var uniqueInstane; function constructor(){ var type = 'Firefox'; var version = '3.6'; function _getType(){return type;} function _getVersion(){return version;} return { getType:function(){return _getType();}, getVersion:function(){return _getVersion();} } } return { getInstance : function(){ if(!uniqueInstane){ console.log('instance init.'); uniqueInstane = constructor(); } return uniqueInstane; } } })(); console.log(Browser.getInstance().getType()); console.log(Browser.getInstance().getVersion());
此时我们这次的单体模式的示例就算是完毕了。
单体模式总结
上面我们示例了几种关于浏览器的单体模式示例。单体模式的好处在于对代码的组织,非常便于维护。结合闭包可以更好的对私有成员的操作。单体模式的弊端在于提供的是一种单点访问,可能导致模块间的强耦合。在选择这种模式的时候应该考虑到这种情况。最适合才是最好的。相关文章推荐
- JS获取单元格所在行
- javascript对table的添加,删除行的操作
- javascript与java的区别
- JavaScript 模块化加载
- javascript(腾讯)
- html css javascript常用的一些笔记
- 关于extjs store远程获取json数组的处理方式
- JS特效:鼠标悬停显示提示
- JSON学习笔记一:JSON入门,JSON初识
- org.codehaus.jackson.JsonParseException: Unexpected character ('<' (code 60)): expected a valid valu
- 纯JS长文章分页代码
- JSON 之FastJson解析
- 14条最佳JS代码编写技巧
- sprytabbedpanels.js库之在页面中插入Tabbed Panels
- javascript z注意点
- ExtJs4学习笔记(二):aptana studio 3 extjs4.2智能提示
- JSP简明教程
- [💯原]Javascript,我们来用js在网页中识别鼠标手势
- JS 索引数组、关联数组和静态数组、动态数组
- 深入理解JavaScript系列(48):对象创建模式(下篇)