AngularJS设计模式:我应该使用工厂来创建构造函数吗?

时间:2013-08-06 05:54:47

标签: javascript design-patterns angularjs

这是我在创建AngularJS应用程序时一直在考虑的事情。当我第一次了解AngularJS工厂时,我认为它们的一个巧妙用法是创建并返回构造函数而不是普通对象,例如:

app.factory("Foo", function() {
  function Foo(bar, baz) {
    this.bar = bar;
    this.baz = baz;
    ...
  }

  Foo.prototype = {
    constructor: Foo,
    method1: function() { ... },
    method2: function() { ... },
    ...,
    methodn: function() { ... },
  };

  return Foo;
});

然后,您可以将该功能注入您的控制器并使用new进行调用。我发现这美观和OOP-y,但现在我开始认为它实际上是一种反模式。问题是当它在AngularJS感知上下文中工作时它可以正常工作,但是一旦你想要从控制台调用构造函数,在Web Worker中使用它,或者在非工作中重用代码AngularJS应用程序,您开始围绕 AngularJS而不是使用它。我开始怀疑这种方法是否被误导,因为javascript中的函数似乎已经是“单身人士”并且似乎不需要任何实例化的帮助。

我滥用AngularJS工厂了吗?使用暴露于全局范围的构造函数会更好吗?更一般地说,是否存在促使AngularJS工厂/服务/提供商在全球对象上使用的特定因素,反之亦然?

2 个答案:

答案 0 :(得分:6)

是!

  

工厂语法:module.factory('factoryName',function);结果:   将factoryName声明为可注入参数时,您将会这样做   提供了通过调用函数引用返回的值   传递给module.factory。 用法:可用于返回a   'class'函数,然后可以用来创建实例。

来源:https://groups.google.com/forum/#!msg/angular/56sdORWEoqg/HuZsOsMvKv4J

上述链接也可用作Bart's评论的来源:AngularJS: Service vs provider vs factory

答案 1 :(得分:0)

也许这在Angular和Javascript的上下文中是一个很好的方便用法(恰好允许使用构造函数和对象原型进行令人难以置信的操作),但是,在我看来,它有点与经典的Factory模式逻辑相矛盾。

Factory意味着在其中构造新对象,应用一些配置,初始化和注入依赖关系到新创建的对象中,如出厂设置中指定的(如果有的话)。

例如,您可以要求工厂创建存储连接,并且工厂创建MySQL连接,SQLite连接或Redis连接 - 您的控制器并不真正关心,只要构造的对象实现某个接口(或在Javascript上下文中使用duck-typing - 如果它像鸭子一样嘎嘎叫,它就是一只鸭子。)

但是,如果您在工厂外调用工厂后使用new关键字,那就好像您说的那样:

“嘿,工厂,给我一些项目的原型(构造函数),我会自己创建项目。”

因此,在这种情况下,您的工厂不是用于创建新对象的“经典工厂”,而是一些原型工厂,它有一个原型可以提供给所有调用者,因此他们可以自己制造新对象。

当你有没有任何参数的简单构造函数时,你可能没问题,但是在经典的例子(存储连接)中这样使用工厂没有意义,因为那时工厂的调用者必须完成这项工作工厂 - 将配置和依赖项注入新创建的对象。