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

请在这里忍受我。 我知道还有其他答案,如:AngularJS:服务vs提供者vs工厂

但是我仍然无法弄清楚什么时候使用服务而不是工厂。

从我所知道的工厂通常用于创建可由多个控制器调用的“通用”功能:创建通用控制器功能

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

说明

你在这里得到不同的东西:

第一:

  • 如果您使用服务,您将获得函数的实例 (“ 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

    “如果你希望你的函数像普通函数一样被调用 ,那么使用工厂 ,如果你希望你的函数被新的操作符实例化,请使用service,如果你不知道它们的区别,请使用factory。


    更新:

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

    并从此页面:

    “工厂和服务是最常用的配方,它们唯一的区别是服务配方对自定义类型的对象更好,而工厂可以生成JavaScript原语和函数。”


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

    这显示了CarService将如何生产一款带有4个气缸的汽车,您无法为个别汽车改变它。 鉴于CarFactory返回一个函数,所以你可以在你的控制器中做一个new CarFactory ,传入特定于该汽车的多个气瓶。 你不能做new CarService因为CarService是一个对象而不是函数。

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

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

    并自动返回一个函数供你实例化,是因为你无法做到这一点(把东西添加到原型/ etc):

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

    看看它是如何从字面上生产汽车的工厂。

    他博客的结论非常好:

    结论是,

    ---------------------------------------------------  
    | Provider| Singleton| Instantiable | Configurable|
    ---------------------------------------------------  
    | Factory | Yes      | Yes          | No          |
    ---------------------------------------------------  
    | Service | Yes      | No           | No          |
    ---------------------------------------------------  
    | Provider| Yes      | Yes          | Yes         |       
    ---------------------------------------------------  
    
  • 当你只需要一个简单的对象如Hash时使用Service,例如{foo; 1,bar:2}这很容易编码,但是你不能实例化它。

  • 当你需要实例化一个对象时,使用工厂,例如新的Customer(),新的Comment()等等。

  • 在需要配置时使用Provider。 即测试网址,质量保证网址,制作网址。

  • 如果你发现你只是在工厂返回一个对象,你应该使用服务。

    不要这样做:

    app.factory('CarFactory', function() {
        return {
            numCylinder: 4
        };
    });
    

    改为使用服务:

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

    所有这些供应商的概念比最初出现的要简单得多。 如果你解剖一个提供者,并且拉出不同的部分,它就变得非常清楚。

    简单地说,这些提供者中的每一个都是另一个提供者的专用版本,按以下顺序: 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/

    链接地址: http://www.djcxy.com/p/2173.html

    上一篇: AngularJS : When to use service instead of factory

    下一篇: How do I get the current date in JavaScript?