这是我在创建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工厂/服务/提供商在全球对象上使用的特定因素,反之亦然?
答案 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
关键字,那就好像您说的那样:
“嘿,工厂,给我一些项目的原型(构造函数),我会自己创建项目。”
因此,在这种情况下,您的工厂不是用于创建新对象的“经典工厂”,而是一些原型工厂,它有一个原型可以提供给所有调用者,因此他们可以自己制造新对象。
当你有没有任何参数的简单构造函数时,你可能没问题,但是在经典的例子(存储连接)中这样使用工厂没有意义,因为那时工厂的调用者必须完成这项工作工厂 - 将配置和依赖项注入新创建的对象。