一直以来对单例模式的理解很凌乱,今天就整体了一下,希望能给用得到的朋友一点帮助。
0.前言
单例(singleton)对象在内存中只存在一份实例,一般用{}来呈现,{}里面有若干的属性和方法。借用该模式可以讲代码组织得更为一致,从而使其更容易阅读和维护。缺点是可能增强了代码之间的强耦合。
1.创建单例模式的方法
1.1 使用对象字面量,即{}
1 var singleton = { 2 3 name: 'cnblogs', 4 5 getName:function(){ 6 7 return this.name; 8 } 9 10 }
1.2 模块模式(module pattern),同时也可以借此创建私有变量,实现封装
1 var singleton = (function(){ 2 // private property and method 3 var privateName = 'cnblog'; 4 function getName(){ 5 return alert(privateName); 6 }; 7 return { 8 name:'public', 9 getName2:function(){ 10 getName(); 11 } 12 } 13 })()
1.3 在使用时初始化(惰性实例化)
1 var singleton = (function(){ 2 var instance; 3 function init(){ 4 return { 5 name:'cnblog', 6 getName:function(){ 7 return this.name; 8 } 9 } 10 }; 11 12 return { 13 getInstance: function(){ 14 if(!instance){ 15 instance = inti(); 16 } 17 return instance; 18 } 19 } 20 })() 21 22 使用: 23 singleton.getInstance().getName()
1.4 通过检测来创建单体模式
var singleton = function(){ var single; return single || (single =new Date()) }() var a = singleton(); var b = singleton(); a === b ; //true,说明是同一个实例 但是: var a = new Date(); var b = new Date(); a === b ; // false,说明指向不同的实例
2.单体对象的用途
2.1 命名空间
在douglas的《js语言精粹》中,提高避免命名冲突的方法是模拟命名空间,而单例模式就可以做到这一点。
1 var nameSpace = { 2 property: ****, 3 4 method: function(){ 5 ....... 6 } 7 } 8 9 使用里面的方法: 10 nameSpace.property 或者 nameSpace.method().
2.2 分支
分支主要用于解决浏览器的差异。例如当使用Ajax的时候,首先需要创建一个XHR对象,众所周知IE和FF、chrome存在着差异,所以每创建一个XHR对象就需要探测浏览器的特性,造成浪费。
1 var createXHRFactory = (function(){ 2 var standXHR = { 3 createXHR:function(){ 4 return new XMLHttpRequest(); 5 } 6 }; 7 var ieXHR = { 8 createXHR:function(){ 9 return new ActiveXObject('microsoft.XMLHTTP'); 10 } 11 }; 12 var testObject; 13 try{ 14 testObject = standXHR.createXHR(); 15 return standXHR; 16 }catch(e){ 17 testObject = ieXHR.createXHR(); 18 return ieXHR; 19 } 20 })()
3.个人总结
1、在内存中只有一份,也就是只能实例化一次;
2、创建方式:首先可以使用对象字面量;第二呢,可以先进行判断,假如已经实例化过了,那么立即返回这个实例,否则创建该实例,然后返回;
3、在创建的过程中使用了自调用的匿名函数;
4、应用场合:模拟命名空间、解决分支分支、模块之间的通信
参考资料:
1、《javascript 设计模式》
2、AlloyTeam :http://www.alloyteam.com/2012/10/common-javascript-design-patterns/
3.汤姆大叔:http://www.cnblogs.com/TomXu/archive/2012/02/20/2352817.html