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”,即可领红包。谢谢支持

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,419评论 2 17
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,264评论 19 139
  • 接触前端两三个月的时候,那时候只是听说设计模式很重要,然后我就去读了一本设计模式的书,读了一部分,也不知道这些设计...
    艰苦奋斗的侯小憨阅读 8,266评论 2 39
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 177,073评论 25 709
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,730评论 18 399

友情链接更多精彩内容