AngularJS:何时使用服务而不是工厂

use*_*747 294 angularjs angularjs-service angularjs-factory

请在这里忍受我.我知道还有其他答案,例如: AngularJS:Service vs provider vs factory

但是,当你在工厂使用服务时,我仍然无法弄清楚.

据我所知,工厂通常用于创建可由多个控制器调用的"通用"功能:创建通用控制器功能

Angular文档似乎更喜欢工厂而不是服务.他们甚至在使用工厂时提到"服务",这更令人困惑!http://docs.angularjs.org/guide/dev_guide.services.creating_services

那么什么时候才能使用服务?

是否有可能通过服务完成或更容易完成的事情?

幕后有什么不同吗?性能/内存差异?

这是一个例子.除了声明的方法,它们看起来完全相同,我无法弄清楚为什么我会做一个与另一个.http://jsfiddle.net/uEpkE/

更新:从托马斯的回答看来,似乎暗示服务是为了更简单的逻辑和工厂用于更复杂的逻辑与私有方法,所以我更新了下面的小提琴代码,似乎两者都能够支持私人功能?

myApp.factory('fooFactory', function() {
    var fooVar;
    var addHi = function(foo){ fooVar = 'Hi '+foo; }

    return {
        setFoobar: function(foo){
            addHi(foo);
        },
        getFoobar:function(){
            return fooVar;
        }
    };
});
myApp.service('fooService', function() {
    var fooVar;
    var addHi = function(foo){ fooVar = 'Hi '+foo;}

    this.setFoobar = function(foo){
        addHi(foo);
    }
    this.getFoobar = function(){
        return fooVar;
    }
});

function MyCtrl($scope, fooService, fooFactory) {
    fooFactory.setFoobar("fooFactory");
    fooService.setFoobar("fooService");
    //foobars = "Hi fooFactory, Hi fooService"
    $scope.foobars = [
        fooFactory.getFoobar(),
        fooService.getFoobar()
    ];
}
Run Code Online (Sandbox Code Playgroud)

Tho*_*ons 278

说明

你有不同的东西:

第一:

  • 如果您使用服务,您将获得函数的实例(" this"关键字).
  • 如果使用工厂,您将获得 通过调用函数引用(工厂中的return语句)返回的值.

ref: angular.service vs angular.factory

第二:

请记住,AngularJS中的所有提供者(价值,常数,服务,工厂)都是单身人士!

第三:

使用一个或另一个(服务或工厂)是关于代码风格.但是,AngularJS 的常用方法是使用工厂.

为什么?

因为 "工厂方法是将对象引入AngularJS依赖注入系统的最常用方法.它非常灵活,可以包含复杂的创建逻辑.由于工厂是常规函数,我们还可以利用新的词法范围来模拟"私有"变量.这非常有用,因为我们可以隐藏给定服务的实现细节."

(参考:http://www.amazon.com/Mastering-Web-Application-Development-AngularJS/dp/1782161821).


用法

服务:通过简单地附加()到注入的函数引用来共享对调用有用的实用程序函数可能很有用.也可以与injectedArg.call(this)或类似的运行.

工厂:可以用于返回"类"函数,然后可以创建实例来创建实例.

因此,如果您的服务中存在复杂的逻辑,并且您不希望暴露这种复杂性,请使用工厂.

在其他情况下,如果要返回服务实例,只需使用服务即可.

但随着时间的推移,你会发现在我认为80%的情况下你会使用工厂.

有关详细信息,请访问:http://blog.manishchhabra.com/2013/09/angularjs-service-vs-factory-with-example/


更新:

优秀的帖子:http: //iffycan.blogspot.com.ar/2013/05/angular-service-or-factory.html

"如果你想像普通函数一样调用你的函数,请使用 factory.如果你想用new操作符实例化你的函数,请使用service.如果你不知道差异,请使用factory."


更新:

AngularJS团队完成了他的工作并给出了解释:http: //docs.angularjs.org/guide/providers

从这个页面:

"工厂和服务是最常用的配方.它们之间的唯一区别是服务配方更适合自定义类型的对象,而Factory可以生成JavaScript原语和功能."

  • "由于工厂是常规功能,我们也可以利用新的词法范围来模拟"私人"变量." - 这不是特定于工厂,您可以对服务做同样的事情. (11认同)
  • Re First:我到处读到,但我不明白它的实际意义.我猜你的回答"大多数情况下"并没有实际的区别吗?谢谢你的书参考! (7认同)

Jon*_*an. 110

allernhwkim最初在链接到他博客的问题上发布了一个答案,但主持人删除了它.这是我发现的唯一一篇文章,它不仅告诉你如何与服务,提供商和工厂做同样的事情,还告诉你如何与一个你不能与工厂一起提供的提供商,以及你不能提供服务的工厂.

直接来自他的博客:

app.service('CarService', function() {
   this.dealer="Bad";
    this.numCylinder = 4;
});

app.factory('CarFactory', function() {
    return function(numCylinder) {
      this.dealer="Bad";
        this.numCylinder = numCylinder
    };
});

app.provider('CarProvider', function() {
    this.dealerName = 'Bad';
    this.$get = function() {
        return function(numCylinder) {
            this.numCylinder = numCylinder;
            this.dealer = this.dealerName;
        }
    };
    this.setDealerName = function(str) {
      this.dealerName = str;
    }      
});
Run Code Online (Sandbox Code Playgroud)

这显示了CarService将如何始终生产出具有4个气缸的汽车,您不能为个别汽车更换它.而CarFactory返回一个函数,以便您可以new CarFactory在控制器中执行,传入特定于该汽车的多个柱面.你不能这样做,new CarService因为CarService是一个对象而不是一个函数.

工厂不能这样工作的原因:

app.factory('CarFactory', function(numCylinder) {
      this.dealer="Bad";
      this.numCylinder = numCylinder
});
Run Code Online (Sandbox Code Playgroud)

并自动返回一个函数供您实例化,因为那时你不能这样做(把东西添加到原型/ etc):

app.factory('CarFactory', function() {
    function Car(numCylinder) {
        this.dealer="Bad";
        this.numCylinder = numCylinder
    };
    Car.prototype.breakCylinder = function() {
        this.numCylinder -= 1;
    };
    return Car;
});
Run Code Online (Sandbox Code Playgroud)

看看它是如何生产汽车的工厂.

他博客的结论非常好:

结论,

---------------------------------------------------  
| Provider| Singleton| Instantiable | Configurable|
---------------------------------------------------  
| Factory | Yes      | Yes          | No          |
---------------------------------------------------  
| Service | Yes      | No           | No          |
---------------------------------------------------  
| Provider| Yes      | Yes          | Yes         |       
---------------------------------------------------  
Run Code Online (Sandbox Code Playgroud)
  1. 当你只需要一个简单的对象(例如Hash)时使用Service,例如{foo; 1,bar:2}它很容易编码,但你无法实例化它.

  2. 需要实例化对象时使用Factory,即新的Customer(),新的Comment()等.

  3. 需要配置时使用Provider.即测试网址,质量保证网址,生产网址.

如果您发现刚刚在工厂返回一个物体,您应该使用服务.

不要这样做:

app.factory('CarFactory', function() {
    return {
        numCylinder: 4
    };
});
Run Code Online (Sandbox Code Playgroud)

改为使用服务:

app.service('CarService', function() {
    this.numCylinder = 4;
});
Run Code Online (Sandbox Code Playgroud)

  • 这对我很有帮助.比较表+1 (11认同)
  • 如果使用一个参数numCylinder定义服务功能,那么它将具有与工厂方法相同的灵活性 (5认同)
  • 好惊讶 !你在这里引用一个博客,两者都说完全相反.你说:工厂 - 实例化 - 是博客说:工厂 - 实例室 - 没有 (4认同)

Lui*_*rez 19

所有这些提供商的概念比最初出现的要简单得多.如果你剖析一个提供者并提取出不同的部分,那就很清楚了.

简单地说,这些供应商的每一个是另一个的专用版本,顺序如下:provider> factory> value/ constant/ service.

只要提供商尽你所能,你可以在链中进一步使用提供商,这将导致编写更少的代码.如果它没有达到你想要的效果,你可以上链,你只需要编写更多的代码.

这张图片说明了我的意思,在这张图片中,您将看到供应商的代码,其中突出显示的部分显示了提供商的哪些部分可用于创建工厂,价值等.

AngularJS提供商,工厂,服务等都是一样的东西http://www.simplygoodcode.com/wp-content/uploads/2015/11/angularjs-provider-service-factory-highlight.png

有关详细信息和博客文章中的示例,请访问:http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/


小智 8

工厂和服务都会产生单例对象,这些对象可以由提供者配置并注入控制器和运行块.从注射者的角度来看,对象来自工厂或服务是绝对没有区别的.

那么,何时使用工厂,何时使用服务?它归结为您的编码偏好,而不是其他任何东西.如果你喜欢模块化JS模式,那就去工厂吧.如果您喜欢构造函数("class")样式,那么请转到该服务.请注意,两种样式都支持私有成员.

从OOP的角度来看,服务的优势可能是更直观:创建"类",并与提供程序一起,在模块之间重用相同的代码,并通过提供来改变实例化对象的行为配置块中构造函数的不同参数.