AngularJS: ¿Qué es una fábrica?


101

He estado trabajando mucho en él Angular.jsy, en general, me parece un marco interesante y poderoso.

Sé que ha habido muchas discusiones sobre servicios versus fábricas versus proveedores versus valores, pero todavía estoy bastante confundido acerca de qué Factoryes.

Factory se ha definido en otras discusiones de StackOverflow como lo siguiente:

Suerte

Sintaxis: module.factory( 'factoryName', function );Resultado: Al declarar factoryName como un argumento inyectable, se le proporcionará el valor que se devuelve al invocar la referencia de función pasada a module.factory.

Encuentro que esta explicación es muy difícil de entender y no aumenta mi comprensión de lo que es una fábrica.

¿A alguien le tiene ningún explicaciones o ejemplos de la vida real para compartir acerca de qué es exactamente una Factoryes y por qué se debe utilizar en lugar de una Service,Provider u otra?

Actualizar

A service tiene una referencia a cualquier objeto .

A factory es una función que devuelve cualquier objeto

A provider es una función que devuelve cualquier función

- uf -


6
No diría que esto es un duplicado de esa pregunta, más bien leí esa pregunta antes de hacer esta, ya que su respuesta Factories(citada anteriormente) era un poco confusa. Algunas de las respuestas a continuación se reducen Factoriesa algo que incluso yo puedo entender
Code Whisperer

1
Esta pregunta tiene más votos positivos que la que "duplica", ¿quizás las cosas deberían ser al revés?
Code Whisperer

3
Este enlace lo explica bien.
Ahmed

Respuestas:


70

Por lo que tengo entendido, todos son prácticamente iguales. Las principales diferencias son sus complejidades. Los proveedores se pueden configurar en tiempo de ejecución, las fábricas son un poco más robustas y los servicios son la forma más simple.

Consulte esta pregunta AngularJS: servicio vs proveedor vs fábrica

Además, esta esencia puede ser útil para comprender las sutiles diferencias.

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

Entonces, una forma de verlos es en orden de complejidad Provider > Factory > Service > Value.
Code Whisperer

2
Esa es una forma de verlo, otra sería pensar en Factory y Service como abstracciones de Provider. Alguien me corrija si me equivoco, pero la fábrica y el servicio utilizan al proveedor bajo el capó. Es por eso que provide es la versión "Closest to the metal". Creo que Value es una forma de definir constantes que luego se pueden usar en toda la aplicación.
Jonathan Palumbo

18

Una gran diferencia que veo es que puede ejecutar código personalizado en la fábrica. Pero, en un servicio, solo ocurre la creación de objetos.

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

    //Write custom code here

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

1
también puede ejecutar código personalizado en una función de constructor de servicios, ¿no? nadie dijo dentro de una función de constructor, no se puede ejecutar otro código
polaridad

9

Mis dos centavos en este tema. Soy un novato y solo entiendo Angular JS y esta fue una de las cosas que me confundió mucho y, por lo tanto, lo estudié con algo de detalle. He estado tomando notas para dar entrevistas y esto puede ser útil para otros.

  • El servicio y la fábrica hacen las mismas cosas de diferentes maneras.
  • ambos son inyectables
  • para la mayoría de las cosas, use la sintaxis de fábrica
  • Más fácil de entender
  • hoy en día con es6 se hace "servicio" ya que convierte mejor a clases es6
  • Es esencialmente abstraer la lógica empresarial del controlador.
  • si usa la lógica de negocios con controladores, solo puede usarla con controladores
  • El controlador es para poner datos en el alcance, no para procesar la lógica de negocios larga
  • Entonces, lo que sucede en el escenario anterior es que la lógica de negocios compleja está ligada a los controladores. No para procesar datos. Así que ponga partes de él en los servicios o en la fábrica. Entonces su código es delgado y modular.
  • los servicios son singletons

0

Los servicios son principalmente objetos en los que se describe la clase constructora del objeto. En algún lugar profundo del marco, se llama a la función Object.create () y luego puede usar un servicio llamando a su objeto y métodos usando un controlador. Factory, por otro lado, no crea un objeto de forma predeterminada y, por lo tanto, requiere que devuelva la ubicación completa del objeto una vez que haya terminado de definir todos los atributos y métodos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.