AngularJS: Was ist eine Fabrik?

101

Ich habe viel gearbeitet Angular.js und finde es insgesamt ein interessantes und leistungsfähiges Framework.

Ich weiß, dass es viele Diskussionen über Dienstleistungen vs. Fabriken vs. Anbieter vs. Werte gegeben hat, aber ich bin immer noch ziemlich verwirrt darüber, was a Factoryist.

Factory wurde in anderen StackOverflow-Diskussionen wie folgt definiert:

Fabriken

Syntax: module.factory( 'factoryName', function );Ergebnis: Wenn Sie factoryName als injizierbares Argument deklarieren, erhalten Sie den Wert, der durch Aufrufen der an module.factory übergebenen Funktionsreferenz zurückgegeben wird.

Ich finde diese Erklärung sehr schwer zu verstehen und sie verbessert nicht mein Verständnis dafür, was eine Fabrik ist.

Würde jemand irgendwelche Erklärungen oder Beispiele aus der Praxis zu teilen , was genau ein Factoryist und warum Sie es anstelle einer verwendet werden soll Service,Provider oder andere?

Aktualisieren

A service enthält einen Verweis auf ein beliebiges Objekt .

A factory ist eine Funktion, die ein beliebiges Objekt zurückgibt

A provider ist eine Funktion, die eine beliebige Funktion zurückgibt

- Puh -

Code Whisperer
quelle
6
Ich würde nicht sagen, dass dies ein Duplikat dieser Frage ist, sondern ich habe diese Frage gelesen, bevor ich sie gestellt habe, da ihre Antwort auf Factories(oben zitiert) etwas verwirrend war. Einige der Antworten unten reduzieren sich Factoriesauf etwas, das selbst ich verstehen kann
Code Whisperer
1
Diese Frage hat mehr positive Stimmen als die, die sie "dupliziert". Vielleicht sollten die Dinge umgekehrt sein?
Code Whisperer
3
Dieser Link erklärt es gut.
Ahmed

Antworten:

70

Soweit ich weiß, sind sie alle ziemlich gleich. Die Hauptunterschiede sind ihre Komplexität. Anbieter können zur Laufzeit konfiguriert werden, Fabriken sind etwas robuster und Services sind die einfachste Form.

Schauen Sie sich diese Frage an AngularJS: Service vs Provider vs Factory

Auch dieser Kern kann hilfreich sein, um die subtilen Unterschiede zu verstehen.

Quelle: https://groups.google.com/forum/#!topic/angular/hVrkvaHGOfc

jsFiddle: http://jsfiddle.net/pkozlowski_opensource/PxdSP/14/

Autor: Pawel Kozlowski

var myApp = angular.module('myApp', []);

//service style, probably the simplest one
myApp.service('helloWorldFromService', function() {
    this.sayHello = function() {
        return "Hello, World!";
    };
});

//factory style, more involved but more sophisticated
myApp.factory('helloWorldFromFactory', function() {
    return {
        sayHello: function() {
            return "Hello, World!";
        }
    };
});

//provider style, full blown, configurable version     
myApp.provider('helloWorld', function() {
    // In the provider function, you cannot inject any
    // service or factory. This can only be done at the
    // "$get" method.

    this.name = 'Default';

    this.$get = function() {
        var name = this.name;
        return {
            sayHello: function() {
                return "Hello, " + name + "!";
            }
        };
    };

    this.setName = function(name) {
        this.name = name;
    };
});

//hey, we can configure a provider!            
myApp.config(function(helloWorldProvider){
    helloWorldProvider.setName('World');
});


function MyCtrl($scope, helloWorld, helloWorldFromFactory, helloWorldFromService) {

    $scope.hellos = [
        helloWorld.sayHello(),
        helloWorldFromFactory.sayHello(),
        helloWorldFromService.sayHello()];
}​
Jonathan Palumbo
quelle
Eine Art, sie zu betrachten, ist, dass sie in der Reihenfolge ihrer Komplexität gehen Provider > Factory > Service > Value?
Code Whisperer
2
Das ist eine Möglichkeit, es zu betrachten, eine andere wäre, Fabrik und Service als Abstraktionen des Anbieters zu betrachten. Jemand korrigiert mich, wenn ich falsch liege, aber Factory and Service Use Provider unter der Haube. Aus diesem Grund ist Provide die "Closest to the Metal" -Version. Ich glaube, Value ist eine Möglichkeit, Konstanten zu definieren, die dann anwendungsweit verwendet werden können.
Jonathan Palumbo
18

Ein wesentlicher Unterschied, den ich sehe, ist, dass Sie benutzerdefinierten Code in der Fabrik ausführen können. In einem Dienst wird jedoch nur ein Objekt erstellt.

myJs.factory('Factory', function() {

    //Write custom code here

    return {
            Hello: function() {
            return "Hello, World!"
        }
    };
});
Hariprasad
quelle
1
Sie können auch benutzerdefinierten Code in einer Servicekonstruktorfunktion ausführen, nicht wahr? Niemand hat in einer Konstruktorfunktion gesagt, dass Sie keinen anderen Code
ausführen
9

Meine zwei Cent zu diesem Thema. Ich bin ein sehr sehr Neuling und habe gerade Verständnis für Angular JS und dies war eines der Dinge, die mich sehr verwirrten und daher habe ich es etwas genauer studiert. Ich habe mir Notizen gemacht, um Interviews zu geben, und dies kann für andere nützlich sein.

  • Service und Fabrik machen das Gleiche auf unterschiedliche Weise
  • beide sind injizierbar
  • Verwenden Sie für die meisten Dinge die Factory-Syntax
  • leichter zu verstehen
  • Heutzutage wird mit es6 "service" ausgeführt, da es besser in es6-Klassen konvertiert wird
  • Es abstrahiert im Wesentlichen die Geschäftslogik vom Controller
  • Wenn Sie Biz-Logik mit Controllern verwenden, können Sie diese nur mit Controllern verwenden
  • Der Controller dient dazu, Daten in den Bereich zu stellen, ohne die lange Geschäftslogik zu verarbeiten
  • Was im obigen Szenario passiert, ist, dass komplexe Geschäftslogik in Controller eingebunden ist. Nicht zur Datenverarbeitung. Legen Sie also Teile davon in Dienstleistungen oder in die Fabrik. Ihr Code ist also schlank und modular.
  • Dienstleistungen sind Singletons
bytise
quelle
0

Services sind meist Objekte, in denen Sie die Konstruktorklasse des Objekts beschreiben. Irgendwo tief im Framework wird die Funktion Object.create () aufgerufen. Anschließend können Sie einen Dienst verwenden, indem Sie sein Objekt und seine Methoden mithilfe eines Controllers aufrufen. Factory hingegen erstellt standardmäßig kein Objekt und erfordert daher, dass Sie den gesamten Objektspeicherort zurückgeben, sobald Sie alle Attribute und Methoden definiert haben.

Kaustubh J.
quelle