Angularjs 这就是服务业和工厂的区别吗?

Angularjs 这就是服务业和工厂的区别吗?,angularjs,angular-services,Angularjs,Angular Services,我读到的关于服务/工厂/供应商的最清楚的例子之一是,它们对应于:一辆汽车,一个给你汽车的工厂(如红色汽车、蓝色汽车),以及一个输出汽车的可配置工厂(如高质量汽车、低质量汽车) 但让我困惑的是“一切都是一个单体”的解释。从上面的示例中,我假设“服务”是返回自身的单例,工厂和提供者是返回对象的单例(每个对象都是唯一的)。也就是说,如果一个控制器有一辆蓝色的车,另一个控制器有一辆红色的车,那么它们将是两辆不同的车 我认为,尽管困惑来自于工厂以两种不同的方式书写。在一种方式中,返回一个对象。这使得它在功

我读到的关于服务/工厂/供应商的最清楚的例子之一是,它们对应于:一辆汽车,一个给你汽车的工厂(如红色汽车、蓝色汽车),以及一个输出汽车的可配置工厂(如高质量汽车、低质量汽车)

但让我困惑的是“一切都是一个单体”的解释。从上面的示例中,我假设“服务”是返回自身的单例,工厂和提供者是返回对象的单例(每个对象都是唯一的)。也就是说,如果一个控制器有一辆蓝色的车,另一个控制器有一辆红色的车,那么它们将是两辆不同的车

我认为,尽管困惑来自于工厂以两种不同的方式书写。在一种方式中,返回一个对象。这使得它在功能上等同于“服务”。另一种方式是,返回一个可实例化对象的函数,以便使用此工厂的任何对象都可以获得新的单独实例


这是正确的吗?在编写工厂的两种方法中,有哪一种是反模式吗?

我所看到的工厂与Javascript中的显示模块设计模式的关系是等价的

模块设计模式-Singelton:

var x = (function() {
    var y = 1,

    zMethod = function() {
       return y + y;
    }

    return {
       y: y,
       z: zMethod 
    }

}());
角度工厂:

angular.module('app', [])
    .factory('x', function() {
        var y = 1,
        zMethod = function() { return y + y; }

        return {
            y: y,
            z: zMethod
        }
    });

有助于澄清幕后发生的事情。。。但这只是三部分中的一部分

我在一篇博客中专门回答了这个问题:

就是这样。我将进行总结,然后再举一些例子:

  • 要传递构造函数时,请使用服务。这个 函数将使用“new”运算符调用,并返回结果 储存的
  • 如果要从工厂返回对象,请使用工厂 功能(即工厂模式)。将调用该函数,并且 结果已存储
  • 当您希望能够提供 在使对象可用之前,为对象进行模块范围的配置
为什么有多种方式?这主要是因为一些基于JavaScript的系统,比如TypeScript和CoffeeScript,生成的代码决定了一种方法而不是另一种方法,所以它具有灵活性


要查看带有示例的完整帖子:

我真的希望他们能在Angular2中解决这个问题。这太复杂了,我看不出有什么真正的好处。在内部,所有的方法都会调用工厂。我一点也不觉得复杂,工厂会返回一些东西,服务会返回一个构造函数,这对经典方法很好。。我使用类似于显示模块的工厂pattern@MattGreer我想你的意思是,在内部,所有的方法都是呼叫提供商。这篇文章我读了五遍,但我最终得到了它(我想):基本上,工厂使用新的关键字,而服务不使用。我一点也不知道这在实际开发中意味着什么。是的,有很多线程都在讨论角度服务之间的区别,但没有一个专门讨论工厂如何以不同的方式使用。最常见的例子只是展示了服务/工厂是如何相同的,一个使用“this”,一个返回一个对象。因此,使用工厂返回一个函数(不像普通的对象),从而能够实例化它返回的不应该使用的内容,这是一种黑客行为?这些名称都是坏名称。工厂意味着使用工厂来设置服务,而服务意味着使用构造函数。他们最终都是单身汉。如果您想创建自己的工厂,您仍然可以使用任何一种方法。一个服务可以有一个函数,它上面有一个返回新实例的函数,而一个工厂可以返回它自己的返回新实例的函数。啊,我明白了,如果需要,一个服务还可以帮助你实例化新实例。工厂这个词对我来说与“创建新对象”联系太多了。谢谢你澄清这一点。(typescript/coffeescript支持的解释也很好!\是的-这里有一个小提琴,演示了如何在Angular中为服务和工厂使用服务和工厂。