Javascript设计模式--单体模式

单体模式 ---- 只有一个实例,共享变量,节省内存空间,使代码的调式和维护变得更轻松


1.脚本加载时就创建

var  singleOb = (function(){
  var ob = {
     a:1,
     b:function(){},
     ....
  };
  return ob;
})()

2.惰性加载,需要的时候才实例化,适合于资源密集型的或配置开支大的单体

  • 在其他语言经常能看到xx.getInstance().doSomething(),getInstance()就是检查单体是否实例化,如果还没有,则实例化并返回这实例,如果单体已实例化,则返回现有实例
var  singleOb = (function(){
  var ob = function(){
    this.a=1;
    ....
  }
  ob.prototype.doSomething = function(){};
  var single;
  return {
     getInstance:  function(){
             if(!single){
                single = new ob()
             }
             return single;
         }
    }
})()

3.脚本加载时半实例化,初始化在init() 方法里

var single;
var hasInit;
var  singleOb = (function(){
  var ob = function(){
    ....
  }
  ob.prototype.init = function(a,b,c) {
     if(!hasInit) {
        this.a = a;
        this.c = c;
        this.b = b;
        .......
        hasInit = true;
     }
     return single;
  }
  ob.prototype.doSomething = function(){};
  single = new ob()
  return single
})()

扩展应用 -- 分支单体

分支: 是一种用来把浏览器间的差异封装到在运行期间进行设置的动态方法中的技术

创建一个返回ajax对象的单体

我们首先应该判断需要多少分支,因为所能实例化的对象只有3种不同类型,所以我们需要3个分支,然后判断并返回有效的分支。

var SimpleXhrFactory = (function() {
  var standard = {
    createXhrObject: function() {
      return new XMLHttpRequest();
    }
  };
  var activeXNew = {
    createXhrObject: function() {
      return new ActiveXObject('Msxml2.XMLHTTP');
    }
  };
  var activeXOld = {
    createXhrObject: function() {
      return new ActiveXObject('Microsoft.XMLHTTP');
    }
  };

  var testObject;
  try {
    testObject = standard.createXhrObject();
    return standard;
  }
  catch(e) {
    try {
      testObject = activeXNew.createXhrObject();
      return activeXOld;
    }
    catch(e) {
      try {
        testObject = activeXOld.createXhrObject();
        return activeXOld;
      }
      catch(e) {
        throw new Error('No XHR object found in this environment');
      }
    }
  }
})();

以上分支技术,适用于任何只有在运行时才能确定具体实现的情况。有了分支技术后,所有那些特性嗅探代码只会执行一次,而不是每生成一个对象就要执行一次。

单体模式之弊

  • 由于该模式提供的是一种单点访问,所以它有可能导致模块间的强耦合
  • 强耦合也不利于单元测试

所以,单体最好还是留给定义命名空间和实现分支型方法这些用途。在这些情况下,耦合不是什么问题

done!

如果觉得文章对你有点用的话,麻烦拿出手机,这里有一个你我都有的小福利(每天一次): 打开支付宝首页搜索“8601304”,即可领红包。谢谢支持

你可能感兴趣的:(Javascript设计模式--单体模式)