AngularJS: Qu'est-ce qu'une usine?

101

J'ai fait beaucoup de travail Angular.jset dans l'ensemble, je trouve que c'est un framework intéressant et puissant.

Je sais qu'il y a eu beaucoup de discussions sur les services contre les usines, les fournisseurs et les valeurs, mais je suis encore assez confus sur ce qu'est un Factory.

L'usine a été définie dans d'autres discussions StackOverflow comme suit:

Des usines

Syntaxe: module.factory( 'factoryName', function );Résultat: Lorsque vous déclarez factoryName comme argument injectable, la valeur renvoyée vous sera fournie en appelant la référence de fonction transmise à module.factory.

Je trouve cette explication très difficile à saisir et cela n'améliore pas ma compréhension de ce qu'est une usine.

Would Quelqu'un at- il des explications ou des exemples de la vie réelle à part sur ce qu'est exactement un Factoryet pourquoi vous devez l' utiliser au lieu d'un Service, Providerou d'une autre?

Mettre à jour

A service contient une référence à n'importe quel objet .

A factory est une fonction qui renvoie n'importe quel objet

A provider est une fonction qui renvoie n'importe quelle fonction

- ouf -

Code Whisperer
la source
6
Je ne dirais pas que c'est un double de cette question, j'ai plutôt lu cette question avant de poser celle-ci car sa réponse sur Factories(citée ci-dessus) était un peu déroutante. Certaines des réponses ci-dessous se réduisent Factoriesà quelque chose que même je peux comprendre
Code Whisperer
1
Cette question a plus de votes positifs que celle qu'elle "duplique", peut-être que les choses devraient être l'inverse?
Code Whisperer
3
Ce lien l' explique bien.
Ahmed

Réponses:

70

D'après ce que je comprends, ils sont tous à peu près les mêmes. Les principales différences sont leurs complexités. Les fournisseurs sont configurables au moment de l'exécution, les usines sont un peu plus robustes et les services sont la forme la plus simple.

Consultez cette question AngularJS: Service vs fournisseur vs usine

Cet élément essentiel peut également être utile pour comprendre les différences subtiles.

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

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

auteur: 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
la source
Donc, une façon de les regarder, est-ce que c'est par ordre de complexité Provider > Factory > Service > Value?
Code Whisperer
2
C'est une façon de voir les choses, une autre serait de penser à l'usine et au service comme des abstractions du fournisseur. Quelqu'un me corrige si je me trompe, mais l'usine et le service utilisent le fournisseur sous le capot. C'est pourquoi fournir est la version "la plus proche du métal". Je pense que Value est un moyen de définir des constantes qui peuvent ensuite être utilisées à l'échelle de l'application.
Jonathan Palumbo
18

Une différence majeure que je vois est que vous pouvez exécuter du code personnalisé en usine. Mais, dans un service, seule la création d'objet se produit.

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

    //Write custom code here

    return {
            Hello: function() {
            return "Hello, World!"
        }
    };
});
Hariprasad
la source
1
vous pouvez également exécuter du code personnalisé dans une fonction de constructeur de service, n'est-ce pas? personne n'a dit à l'intérieur d'une fonction de constructeur, vous ne pouvez pas exécuter d'autre code
nonopolarité
9

Mes deux cents sur ce sujet. Je suis un très très débutant et je comprends juste Angular JS et c'est l'une des choses qui m'a beaucoup dérouté et je l'ai donc étudié en détail. J'ai pris des notes pour donner des interviews et cela peut être utile à d'autres.

  • le service et l'usine font les mêmes choses de différentes manières
  • les deux sont des injectables
  • pour la plupart des choses, utilisez la syntaxe d'usine
  • plus facile à comprendre
  • de nos jours avec es6 "service" est fait car il convertit mieux en classes es6
  • sa logique commerciale est essentiellement abstraite du contrôleur
  • si vous utilisez la logique biz avec des contrôleurs, vous ne pouvez utiliser qu'avec des contrôleurs
  • le contrôleur sert à mettre des données sur la portée sans traiter la longue logique biz
  • donc ce qui se passe dans le scénario ci-dessus est que la logique complexe de biz est liée aux contrôleurs. Pas pour le traitement des données. Alors mettez-en des morceaux dans des services ou des usines. Votre code est donc léger et modulaire.
  • les services sont des célibataires
bytise
la source
0

Les services sont principalement des objets dans lesquels vous décrivez la classe de constructeur de l'objet. Quelque part au plus profond du cadre, la fonction Object.create () est appelée et vous pouvez ensuite utiliser un service en appelant son objet et ses méthodes à l'aide d'un contrôleur. Factory, par contre, ne crée pas d'objet par défaut et vous oblige donc à renvoyer l'emplacement de l'objet entier une fois que vous avez défini tous les attributs et méthodes.

Kaustubh J
la source