Javascript 模块模式真的必须是单例模式吗?

Javascript 模块模式真的必须是单例模式吗?,javascript,design-patterns,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() {} }; })(

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

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() {}
     };
 }

是的,模块是单例的。汽车只有一个发动机。创建第二个是没有意义的(除非您彻底改变整个设计,增加任何struts可以承受的负载,等等)


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

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

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=[];

对于(var i=0;i我一直认为模块模式是非单例版本。事实上,我尽可能避免单例,尤其是当它们有状态时。从测试的角度来看,它们是一场噩梦,尤其是作为自调用函数编写时

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


是一篇抓住要点的文章,至少我是这么看的。

是的,一个模块应该是一个单独的模块,创建一个模块的多个实例实际上没有意义,因为它实际上只是一个“助手”函数和您可以调用的方法等。整个要点只是创建一个具有私有作用域的闭包,这样模块就不会干扰其他代码。第二个示例不是模块,它只是一个返回对象的函数。不,它确实有资格将其用作带有公共和私有变量的“类”。您可以使用该模块但是,创建类的模式。@Bergi:这不太正确。您可以在模块模式中包含类模式。但是类和模块模式是不同的东西,用于实现不同的目标。您不应该将两者混合使用(无论是在代码中还是在谈论它们时)为了避免混淆。好吧,我承认这可能会让人混淆,但你可以(而且经常是:,)混合它们。这仍然是一个单独的例子:你的公司只有一个电机厂。这是我的观点。第一个例子是一个类模式,而不是一个模块。在JavaScript中,两者之间没有明确的区别,所以代码必须按照描述的内容来做。否则,你的心智模型会让你在遇到问题时使用错误的预期你开始调试。我的心智模型包括类,所以没有问题:-+ 1,你应该考虑在例子中使用模块范围。你的单工厂功能是在工程之上。你应该让事情尽可能简单。你也可以把它写成
var point=function(x,y){return{x:x,y:y};}@North。是的,但是过度工程是为了回答关于模块模式的原始帖子。我将对此添加一条注释。模块模式的要点是拥有私有状态,您只能通过使用在返回对象中公开的函数来更改私有状态。您很少需要在模块的所有实例之间共享状态。通常,您对实例感兴趣,希望它有自己的状态。但我确实看到了您来自何方(module=singleton)。
var points = [];
for (var i=0; i<4; i++){
  points[i] = (function module() {
    // same code
    return {
      publicFunc:  function() {}
    };
  })();
}