• js设计模式(1)单例模式


       一直以来对单例模式的理解很凌乱,今天就整体了一下,希望能给用得到的朋友一点帮助。

        0.前言

          单例(singleton)对象在内存中只存在一份实例,一般用{}来呈现,{}里面有若干的属性和方法。借用该模式可以讲代码组织得更为一致,从而使其更容易阅读和维护。缺点是可能增强了代码之间的强耦合。

       1.创建单例模式的方法

        1.1  使用对象字面量,即{}    

    View Code
     1 var  singleton = {
     2  
     3         name: 'cnblogs',
     4 
     5         getName:function(){
     6 
     7                     return this.name;
     8         }
     9 
    10 }

        1.2  模块模式(module pattern),同时也可以借此创建私有变量,实现封装    

    View Code
     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 在使用时初始化(惰性实例化) 

    View Code
     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语言精粹》中,提高避免命名冲突的方法是模拟命名空间,而单例模式就可以做到这一点。        

    View Code
     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对象就需要探测浏览器的特性,造成浪费。

    View Code
     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 

  • 相关阅读:
    ExtJS4 带清除功能的文本框 triggerfield
    ExtJS 4 MVC 创建 Viewport
    Sql Server 查询重复记录
    oracle 备份数据
    sql server 日期模糊查询
    SQL Server 日期转换成字符串
    Kurento应用开发指南(以Kurento 5.0为模板) 之中的一个:简单介绍,安装与卸载
    magento getCarriers 分析
    用两个小样例来解释单例模式中的“双重锁定”
    POJ 3592--Instantaneous Transference【SCC缩点新建图 && SPFA求最长路 && 经典】
  • 原文地址:https://www.cnblogs.com/shamoguying1140/p/3031117.html
Copyright © 2020-2023  润新知