模块模式必须真的是单身吗?

时间:2014-07-21 08:59:35

标签: javascript design-patterns

模块模式被大多数人描述为:

var module = (function() {
     // private fields
     var a, b, c;

     // private functions
      function myFunction() {}

     // public data (where you expose to outside)
     return {
       publicFunc:  function() {}
     };
})();

但是上面的代码创建了一个模块的实例。它真的必须是一个单身人士吗?

下面的代码是否仍然是模块模式?

function module() {

   // same code

   return {
       publicFunc:  function() {}
     };
 }

3 个答案:

答案 0 :(得分:3)

是的,模块模式返回一个单例,但这不是一个实际的限制。您可以使用模块模式返回单件工厂函数,然后多次调用该工厂函数。

var point = (function() {
  // Add private code here to make use of module pattern.
  // If you don't have anything to keep private, then
  // module pattern is overkill, as noted in the comments
  return function(x,y) {
    return { 
      x : x,
      y: y
    }
  }
})();

var point1 = point(0,0);
var point2 = point(3,4);

不使用工厂函数,您也可以将模块模式放在循环中并多次执行(不推荐这样做,因为效率非常低):

var points = [];
for (var i=0; i<4; i++){
  points[i] = (function module() {
    // same code
    return {
      publicFunc:  function() {}
    };
  })();
}

更新:在@North和@ Bergi的反馈下面的第一个例子中添加评论

答案 1 :(得分:1)

是的,模块是单身人士。一辆汽车只有一个发动机。创建第二个根本没有意义(除非你从根本上改变整个设计,增加任何struts可以承担的负载等)。

第二种模式是“类”模式,你有许多行为相似的实例(想想一堆汽车)。

答案 2 :(得分:0)

我一直认为模块模式是非单例版本。事实上,我确实尽可能地避免单身人士,特别是如果他们有州。从测试的角度来看,它们是一场噩梦,特别是在作为自我调用函数编写时。

对我来说,模块模式完全是封装状态。如果我只使用模块的单个实例,我只称它为单例模块。

Here是一篇抓住它的要点的文章,至少我是如何看待它的。