AngularJS: Cos'è una fabbrica?


101

Ho lavorato molto Angular.jse nel complesso trovo che sia un framework interessante e potente.

So che ci sono state molte discussioni su Servizi, fabbriche, fornitori e valori, ma sono ancora piuttosto confuso su cosa Factorysia.

Factory è stato definito in altre discussioni StackOverflow come segue:

fabbriche

Sintassi: module.factory( 'factoryName', function );Risultato: quando si dichiara factoryName come argomento iniettabile, verrà fornito il valore restituito invocando il riferimento alla funzione passato a module.factory.

Trovo che questa spiegazione sia molto difficile da comprendere e non aumenta la mia comprensione di cosa sia una fabbrica.

Qualcuno ha spiegazioni o esempi di vita reale a quota su ciò che esattamente un Factorye perché lo deve usare al posto di una Service, Providero altro?

Aggiornare

A service contiene un riferimento a qualsiasi oggetto .

A factory è una funzione che restituisce qualsiasi oggetto

A provider è una funzione che restituisce qualsiasi funzione

- uff -


6
Non direi che questo è un duplicato di quella domanda, piuttosto ho letto quella domanda prima di chiederla perché la sua risposta su Factories(citata sopra) era un po 'confusa. Alcune delle risposte seguenti si riducono Factoriesa qualcosa che persino io riesco a dare un senso
Code Whisperer

1
Questa domanda ha più voti positivi rispetto a quella che "duplica", forse le cose dovrebbero essere il contrario?
Code Whisperer

3
Questo collegamento lo spiega bene.
Ahmed

Risposte:


70

Da quello che ho capito sono praticamente tutti uguali. Le principali differenze sono le loro complessità. I provider sono configurabili in fase di runtime, le fabbriche sono un po 'più robuste ei servizi sono la forma più semplice.

Dai un'occhiata a questa domanda AngularJS: servizio vs provider vs fabbrica

Anche questa sintesi può essere utile per comprendere le sottili differenze.

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

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

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

Quindi un modo di guardarli è che in ordine di complessità vanno Provider > Factory > Service > Value?
Code Whisperer

2
Questo è un modo per vederlo, un altro sarebbe pensare a Factory e Service come astrazioni di Provider. Qualcuno mi corregge se sbaglio ma la fabbrica e il servizio usano il fornitore sotto il cofano. Ecco perché fornire è la versione "Closest to the metal". Credo che Value sia un modo per definire costanti che possono essere utilizzate in tutta l'applicazione.
Jonathan Palumbo

18

Una delle principali differenze che vedo è che puoi eseguire codice personalizzato in fabbrica. Ma, in un servizio, avviene solo la creazione di oggetti.

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

    //Write custom code here

    return {
            Hello: function() {
            return "Hello, World!"
        }
    };
});

1
puoi anche eseguire codice personalizzato in una funzione di costruzione di servizi, vero? nessuno ha detto all'interno di una funzione di costruzione, non è possibile eseguire altro codice
nonopolarità

9

I miei due centesimi su questo argomento. Sono un principiante e ho appena capito Angular JS e questa è stata una delle cose che mi ha confuso molto e quindi l'ho studiato in qualche modo in dettaglio. Ho preso appunti per rilasciare interviste e questo può essere utile ad altri.

  • il servizio e la fabbrica fanno le stesse cose in modi diversi
  • entrambi sono iniettabili
  • per la maggior parte delle cose usa la sintassi di fabbrica
  • più facile da capire
  • al giorno d'oggi con es6 "servizio" è fatto poiché converte meglio in classi es6
  • essenzialmente astrae la logica aziendale dal controller
  • se utilizzi la logica biz con i controller, puoi utilizzarla solo con i controller
  • controller serve per mettere i dati sull'ambito non per elaborare una logica biz lunga
  • quindi ciò che accade nello scenario precedente è che la logica biz complessa è legata ai controller. Non per l'elaborazione dei dati. Quindi mettine pezzi e pezzi nei servizi o nella fabbrica. Quindi il tuo codice è snello e modulare.
  • i servizi sono singoli

0

I servizi sono principalmente oggetti in cui descrivi la classe costruttore dell'oggetto. Da qualche parte nel profondo del framework, viene chiamata la funzione Object.create () e quindi è possibile utilizzare un servizio chiamando il suo oggetto e metodi utilizzando un controller. Factory, d'altra parte, non crea un oggetto per impostazione predefinita e quindi richiede di restituire l'intera posizione dell'oggetto una volta che hai finito di definire tutti gli attributi e metodi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.