《JavaScript设计模式》章5--单体模式

单体的基本结构

好气,之前写了好久的东西由于公司停电全没了,这篇全部是重写的。。。就当温故知新了吧...

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

划分命名空间

var nameSpace = {
  findProduct: function() {...}
}
//这里的findProduct不会覆盖前面的,因为前面的是通过nameSpace.findProduct()进行访问
var findProduct = 1

拥有私有成员的单体

使用下划线表示私有

这种形式的私有性完全靠自觉

var mySingle = {
  //公有成员
  attribute_one: 1,
  //私有成员,下划线开头
  _attribute_two: true
}

使用闭包实现私有

基本思路就是使用立即执行函数来返回一个对象字面量

var mySingle = (function() {
  //这里定义的成员是私有的
  var attribute_me = false
  //方法也可以私有
  function_me: function() {...}
  return {
  //公共成员可以在这里暴露出去
  attribute_pub: 1,
  //可以暴露出操作私有成员的公共方法例如setName, getName等
  ...
  }
})()

惰性实例化单体

思路:把前面立即执行的函数中的逻辑封装成一个构造函数,然后返回一个公用的实例化方法来调用构造函数

//这里使用dx来代表“惰性”...
var mySingle_dx = (function() {
  constructor: functionn() {
    //之前的代码,就是相当于把直接的return转换成调用constructor()才返回
    ...
  }
  //将实例化的方法暴露出去
  return {
    getInstance: function() {
      return constructor()
    }
  }
})()

真正的体现“单体”

我们在前面代码的基础上需要做到: 未实例化返回新实例,否则返回已有实例

//这里使用dx来代表“惰性”...
var mySingle_dx = (function() {
  constructor: functionn() {
    //之前的代码,就是相当于把直接的return转换成调用constructor()才返回
    ...
  }
  //在这里新增一个私有属性来标记是否已经被实例化
  var uniqueInstance;
  //将实例化的方法暴露出去
  return {
    getInstance: function() {
      //根绝实例化的情况作出不同的处理
      if(!uniqueInstance) {
        uniqueInstance = constructor()
      }
      return uniqueInstance;
    }
  }
})()

分支

思路: 在我们前面之间返回一个对象的思路基础上,根据业务条件声明好多个(类似的)对象字面量,但最终只返回其中满足条件的一个

var mySingle_branch = (function() {
  var objA = {
   //定义属性和方法
  }
  var objB =  {
    //定义属性和方法
  }
  return (someConditions) ? objA : objB
})()
posted @ 2021-07-05 16:28  yancy_s  阅读(57)  评论(0)    收藏  举报