JS设计模式---5.单体模式

何为单体模式

单体是一个用来划分命名空间并将相关一批方法和属性组织在一起的对象,如果它可以被实例化,那么它只能被实例化一次。

单体模式之利

  • 调试维护轻松,利于理解
  • 防止误改,提升网页稳定性
  • 减少不必要的内存消耗(宽带消耗)

单体模式之弊

  • 会导致模块间的强耦合
  • 不利于单元测试

认识单体及其应用

单体的基本结构
var Singleton = {
  attribute1:true,
  attribute2:10,
  method1:function(){

  },
  method2:function () {
    
  }
}

其实就是字面量对象,如果按照严格的定义来说,这并不能算一个单体,因为它不是一个可以实例化的类。

划分命名空间

单体对象由两个部分组成:包含着方法和属性成员的对象本身,以及用于访问它的变量。

 function findProduct() {
    console.log('555')
  }
  findProduct(); // 555
  var findProduct = function () {
    console.log('666')
  } 
  findProduct() //666

函数中声明变量时如果不使用var关键字,那么变量将被声明为全局性的。因此会干扰到全局命名空间中的其他代码

var MyNamespace = {
  findProduct:function(){
    //  ...
  }
}
// 现在findProduct函数是MyNamespace中的一个方法,它不会被全局命名中声明的任何新变量改写

// 命名空间还可以进异步分割,如下
var GiantCorp = {};
GiantCorp.Common = {
  // ...
}
GiantCorp.ErrorCodes = {
  // ...
}
GiantCorp.PageHandler = {
  // ...
  
}
用做特定网页专用代码的单体

已经了解到如何把单体作为命名空间使用后,我们还需要知道单体模式的一个特殊用途。在拥有许多网页的网站中,有些js代码是所有网页都要用到的,他们通常被放在独立的文件中。比如我们经常用到的jquery, lodash.js等他们就是作专用代码的单体

拥有私用成员的单体
下划线表示法
   // 默认GianCorp存在
    GianCorp.DataParser = {
      // 私有方法
      _srtipWhitespace:function(str){
        return str.replace(/\s+/,''); 
      },
      _stringSplit:function (str,delimiter) {
        return str.split(delimiter)
      },
      // 公用方法
      srtingToArray:function(str,delimiter,stripWs){
          if (stripWs) {
            str= this._srtipWhitespace(str)
          }
          var outputArray = this._stringSplit(str,delimiter)
          return outputArray
      }
    }

这个栗子中的单体对象有一个公用方法srtingToArray:function,它的主要工作靠_srtipWhitespace和_stringSplit这两个私有方法完成。将他们设计为私有方法,重构所有内部代码时就不必担心会殃及别人的程序。下划线这个标记前面也讲过,一般情况下是没有人调用它的。

闭包
 MyNamespace.singleton= (function () {
     // 私有成员
     var privateAttribute1 = false;
     var privateAttribute2 = [1,2,3];
     function privateMethod1() {
       //...
     };
     function privateMethod2() {
       //...
     };
     return {
       //公共成员
       publicAttribute1:true,
       publicAttribute2:10,
       publicMethod1:function(){
         //...     
       },
       publicMethod2:function(){
         //...
       }
     }
   })()

这种单体模式又称模块模式,指的是它可以吧一批相关方法和属性组织为模块并起到划分命名空间的作用。
这种模式与下划线表示法相比有亟待呢优势。把私有成员放到闭包中可以确保其不会在单体对象之外被使用。你可以自由地改变对象的实现细节,还不会殃及比尔的代码。还可以用这种方法对数据进行保护和封装。

惰性实例化

前面所讲的单体模式的各种实现方式有一个共同点:单体对象都是在脚本加载时被创建出来。对于资源密集型的或配置开销甚大的单体,更合理的做法是将其实例化推迟到需要使用它的时候。这种技术被称为惰性加载。

  MyNamespace.singleton= (function () {
    var uniqueInstance;  //实例
    function constructor() {  //构造器 (最终返回的单体)
      // 私有成员
      var privateAttribute1 = false;
      var privateAttribute2 = [1,2,3];
      function privateMethod1() {
       //...
      };
      function privateMethod2() {
       //...
      };
      return {
       //公共成员
        publicAttribute1:true,
        publicAttribute2:10,
        publicMethod1:function(){
          //...     
        },
        publicMethod2:function(){
          //...
        }
      }
    };
    return {
      getInstance:function(){
        if (!uniqueInstance) {   // 判断实例存不存在
          uniqueInstance = constructor()
        }
        return uniqueInstance; 
      }
    }
   })()
   // 使用
   //   MyNamespace.singleton.publicMethod1()   before
   MyNamespace.singleton.getInstance().publicMethod1()  //after
分支
 MyNamespace.singleton= (function () {
      var obj1 = {
        //...
      }
      var obj2 = {
        // ...
      }
      return (someCondition)?obj1:obj2
   })()

主要做兼容用

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,709评论 2 17
  • 工厂模式 单体模式 模块模式 代理模式 职责链模式 命令模式 模板方法模式 策略模式 发布-订阅模式 中介者模式 ...
    HelloJames阅读 1,003评论 0 6
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,076评论 1 32
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,092评论 0 21
  • 睡到中午,随便打扮了一下就去酒店和sasa,Lucy,格子聚会。自己没想到准备什么,她们却各自准备了礼物,sasa...
    超级傻妞阅读 174评论 0 0