AngularJS: Co to jest fabryka?

102

Wykonałem dużo pracy Angular.jsi ogólnie uważam, że jest to interesujący i potężny framework.

Wiem, że było wiele dyskusji na temat usług, fabryk, dostawców i wartości, ale nadal jestem dość zdezorientowany, co to Factoryjest.

Fabryka została zdefiniowana w innych dyskusjach StackOverflow w następujący sposób:

Fabryki

Składnia: module.factory( 'factoryName', function );Wynik: Podczas deklarowania factoryName jako argumentu do wstrzyknięcia, otrzymasz wartość, która jest zwracana przez wywołanie odwołania do funkcji przekazanego do module.factory.

Wydaje mi się, że to wyjaśnienie jest bardzo trudne do zrozumienia i nie zwiększa mojego zrozumienia, czym jest fabryka.

Czy ktoś posiada żadnych wyjaśnień lub przykładów prawdziwe życie na akcję o co dokładnie Factoryjest i dlaczego warto go użyć w miejsce Service, Providerlub inne?

Aktualizacja

A service zawiera odniesienie do dowolnego obiektu .

A factory to funkcja, która zwraca dowolny obiekt

A provider to funkcja, która zwraca dowolną funkcję

- uff -

Zaklinacz kodów
źródło
6
Nie powiedziałbym, że jest to duplikat tego pytania, raczej przeczytałem to pytanie przed zadaniem tego pytania, ponieważ jego odpowiedź na Factories(cytowana powyżej) była trochę zagmatwana. Niektóre z poniższych odpowiedzi sprowadzają się Factoriesdo czegoś, co nawet ja potrafię zrozumieć
Zaklinacz kodu
1
To pytanie ma więcej głosów pozytywnych niż to, które „powiela”, może powinno być na odwrót?
Code Whisperer
3
Ten link dobrze to wyjaśnia.
Ahmed

Odpowiedzi:

71

Z tego, co rozumiem, wszystkie są prawie takie same. Główne różnice to ich złożoność. Dostawcy są konfigurowalni w czasie wykonywania, fabryki są nieco bardziej niezawodne, a usługi są najprostszą formą.

Sprawdź to pytanie AngularJS: Serwis vs dostawca vs fabryka

Również ta treść może być pomocna w zrozumieniu subtelnych różnic.

Źródło: https://groups.google.com/forum/#!topic/angular/hVrkvaHGOfc

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

autor: Paweł Kozłowski

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
źródło
Więc jednym ze sposobów patrzenia na nie jest to, że idą w kolejności złożoności Provider > Factory > Service > Value?
Zaklinacz kodów
2
To jeden sposób spojrzenia na to, innym byłoby myślenie o Fabryce i Serwisie jako o abstrakcjach Dostawcy. Ktoś mnie poprawi, jeśli się mylę, ale pod maską dostawcy usług fabrycznych. Dlatego dostarczamy wersję „Closest to the metal”. Uważam, że wartość jest sposobem definiowania stałych, które mogą być następnie używane w całej aplikacji.
Jonathan Palumbo
18

Jedną z głównych różnic, które widzę, jest to, że można uruchomić niestandardowy kod w fabryce. Ale w usłudze dzieje się tylko tworzenie obiektów.

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

    //Write custom code here

    return {
            Hello: function() {
            return "Hello, World!"
        }
    };
});
Hariprasad
źródło
1
możesz również uruchomić niestandardowy kod w funkcji konstruktora usługi, prawda? nikt nie powiedział, że wewnątrz funkcji konstruktora nie można uruchomić innego kodu
nonopolarity
9

Moje dwa grosze w tym temacie. Jestem bardzo, bardzo początkującym użytkownikiem i po prostu rozumiem Angular JS i to była jedna z rzeczy, która bardzo mnie zdezorientowała, dlatego przestudiowałem to nieco szczegółowo. Robiłem notatki do udzielania wywiadów i może to być przydatne dla innych.

  • serwis i fabryka robią to samo na różne sposoby
  • oba są wstrzyknięciami
  • dla większości rzeczy użyj składni fabrycznej
  • łatwiejsze do zrozumienia
  • obecnie z "usługą" es6 jest wykonywana, ponieważ konwertuje się lepiej na klasy es6
  • jego zasadniczo oddziela logikę biznesową od kontrolera
  • jeśli używasz logiki biz z kontrolerami, możesz używać tylko z kontrolerami
  • kontroler służy do umieszczania danych w zakresie, a nie przetwarzania długotrwałej logiki biznesowej
  • więc w powyższym scenariuszu złożona logika biz jest powiązana z kontrolerami. Nie do przetwarzania danych. Więc włóż jego fragmenty do usług lub fabryki. Twój kod jest więc oszczędny i modułowy.
  • usługi są singletonami
bytise
źródło
0

Usługi to głównie obiekty, w których opisujesz klasę konstruktora obiektu. Gdzieś w głębi struktury wywoływana jest funkcja Object.create (), a następnie można użyć usługi, wywołując jej obiekt i metody za pomocą kontrolera. Z drugiej strony Factory nie tworzy obiektu domyślnie i dlatego wymaga zwrócenia całej lokalizacji obiektu po zakończeniu definiowania wszystkich atrybutów i metod.

Kaustubh J
źródło