javascript设计模式_第二部分_单体模式

 单体模式
优点:把代码组织得一致并隔离,更容易阅读和维护,提高稳定性;用于优化,提升性能
缺点:可导致强耦合

5.1 单体的基本结构

var Singleton = { attribute1 : true, attribute2 : 10, method1 : function(){}, method2 : function(){} };

 

严格按定义来说,C1不是一个单体,因为它不是一个可实例化的类
对象字面量只是创意单体的方式之一.
并非所有的对象字面量都是单体,只用来模仿关联数组及容纳数据的就不是单体.

5.2 划分命名空间

var MyNamespace = {} MyNamespace.common = {};

 

5.3 用作特定网页专用代码的包装器的单体

GiantCorp.RegPage = { FORM_ID : 'reg-form', //method handSubmit : function(e){ e.preventDefault(); //... GiantCorp.RegPage.sendRegistration(); }, init : function(){ GiantCorp.RegPage.formEl = $(GiantCorp.RegPage.FORM_ID); addEvent(GiantCorp.RegPage.formEl,'submit',GiantCorp.RegPage.handSubmit); } }; addLoadEvent(GiantCorp.RegPage.init); //以上代码将属性及方法都统一到一个单体中,并通过init来绑定事件,最后在页面上调用init即可实现特定页面的使用

 

 

某网页专用代码,最好馐在自己的单体对象中

5.4 拥有私用成员的单体
 1) 下划线表示法

GiantCorp.DataParser = { //Private methods _stripWhitespace : function(str){ return str.replace(//s+/,''); }, _stringSplit : function(str,delimiter){ return str.split(delimiter); }, //Public method stringToArray : function(str, delimiter,stripWS){ if(stripWS){ str = this._stripWhitespace(str); } var outputArray = this._stringSplit(str,delemiter); return outputArray; } }

 

 

    2) 使用闭包
     MyNamespace.Singleton = (function(){ return {}; })();

 

这种方式与直接使用对象字面量没什么区别,但这个包装函数创建了一个可以用来添加私用成员的闭包,任何添加在这个匿名函数中而不在对象字面量中的都将成为私有成员

MyNamespace.Singleton = (function(){ //Private members var p1 = false; var p2 = 10; function p3(){} return { //Public members pub1 : true, pub2 : 10, pub3 : function(){} }; })();


        试比较

 

GiantCorp.DataParser = (function(){ var whitespaceRegex = //s+/; function stripWhitespace(str){ return str.replace(whitespaceRegex,''); } function stringSplit(str,delimiter){ return str.split(delimiter); } return { stringToArray : function(str,delimiter,stripWS){ if(stripWS){ str = stripWhitespace(str); } var outputArray = stringSplit(str,delimiter); return outputArray; } } })()  
       
5.5 惰性实例化(lazy loading)

 

MyNamespace.Singleton = (function(){ var uniqueInstance; function constructor(){ //... } return { getInstance : function(){ if(!uniqueInstance){ uniqueInstance = constructor(); } return uniqueInstance; } } })() //访问方法 MyNamespace.Singleton.getInstance().Method();

 

 开销大的单体,合理的做法是将其实例化推迟到需要使用的时候
    方法步骤:
    1)将单体所有代码移到一个方法中如constructor(),这个方法不能从闭包外访问.
 2)用一个属性判断是否已实例化过
    3)返回这个实例
   
5.6 分支(branching)
 把差异封装到运行期间进行设置的动态方法中的技术,适合于针对特定的环境做判断

 

MyNamespace.Singleton = (function(){ var oA = { method1 : function(){} } var oB = { method1 : function(){} } return (someCondition)?oA:oB; })()

你可能感兴趣的:(学习笔记)