AngularJS: O que é uma fábrica?

101

Tenho trabalhado muito Angular.jse, no geral, acho que é uma estrutura interessante e poderosa.

Eu sei que tem havido muitas discussões sobre Serviços vs. Fábricas vs. Provedores vs. Valores, mas ainda estou muito confuso sobre o que Factoryé.

Factory foi definido em outras discussões StackOverflow como o seguinte:

Fábricas

Sintaxe: module.factory( 'factoryName', function );Resultado: Ao declarar factoryName como um argumento injetável, você receberá o valor que é retornado ao invocar a referência de função passada para module.factory.

Acho essa explicação muito difícil de entender e não aumenta minha compreensão do que é uma fábrica.

Será que alguém tem nenhum explicações ou exemplos da vida real para compartilhar sobre o que exatamente um Factoryé e por que você deve usá-lo em vez de um Service, Providerou outro?

Atualizar

A service contém uma referência a qualquer objeto .

A factory é uma função que retorna qualquer objeto

A provider é uma função que retorna qualquer função

- ufa -

Sussurrador de Código
fonte
6
Eu não diria que esta é uma duplicata da pergunta, em vez disso, li essa pergunta antes de fazer esta, pois sua resposta em Factories(citado acima) foi um pouco confusa. Algumas das respostas abaixo se reduzem Factoriesa algo que até eu consigo entender
Code Whisperer
1
Esta questão tem mais votos positivos do que a que "duplica", talvez as coisas devam ser ao contrário?
Codigo Whisperer
3
Este link explica isso bem.
Ahmed

Respostas:

70

Pelo que entendi, eles são todos iguais. As principais diferenças são suas complexidades. Os provedores são configuráveis ​​em tempo de execução, as fábricas são um pouco mais robustas e os serviços são a forma mais simples.

Confira esta questão AngularJS: Serviço vs provedor vs fábrica

Além disso, essa essência pode ser útil para compreender as diferenças sutis.

Fonte: 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
fonte
Então, uma forma de encará-los é por ordem de complexidade que eles vão Provider > Factory > Service > Value?
Codigo Whisperer
2
Essa é uma maneira de ver isso, outra seria pensar em Factory e Service como abstrações de Provider. Alguém me corrija se eu estiver errado, mas a Fábrica e o Serviço usam o Provedor sob o capô. É por isso que a versão "mais próxima do metal" é fornecida. Acredito que Value é uma maneira de definir constantes que podem ser usadas em todo o aplicativo.
Jonathan Palumbo
18

Uma das principais diferenças que vejo é que você pode executar o código personalizado na fábrica. Mas, em um serviço, só acontece a criação de objetos.

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

    //Write custom code here

    return {
            Hello: function() {
            return "Hello, World!"
        }
    };
});
Hariprasad
fonte
1
você também pode executar o código personalizado em uma função de construtor de serviço, não é? ninguém disse dentro de uma função de construtor, você não pode executar outro código
polaridade
9

Meus dois centavos neste tópico. Eu sou um novato e estou apenas começando a entender o Angular JS e isso foi uma das coisas que me confundiu muito e, portanto, estudei com alguns detalhes. Tenho feito anotações para dar entrevistas e isso pode ser útil para outras pessoas.

  • serviço e fábrica fazem as mesmas coisas de maneiras diferentes
  • ambos são injetáveis
  • para a maioria das coisas use a sintaxe de fábrica
  • mais fácil de entender
  • hoje em dia com es6 "serviço" é feito porque converte para classes es6 melhor
  • é essencialmente abstrair a lógica de negócios do controlador
  • se você usa lógica de negócios com controladores, você só pode usar com controladores
  • controlador é para colocar dados no escopo, não para processar lógica de negócios longa
  • então o que acontece no cenário acima é que a lógica complexa dos negócios está ligada aos controladores. Não para processamento de dados. Portanto, coloque pedaços dele em serviços ou fábricas. Portanto, seu código é simples e modular.
  • serviços são singletons
bytise
fonte
0

Os serviços são principalmente objetos nos quais você descreve a classe do construtor do objeto. Em algum lugar dentro da estrutura, a função Object.create () é chamada e você pode usar um serviço chamando seu objeto e métodos usando um controlador. A fábrica, por outro lado, não cria um objeto por padrão e, portanto, exige que você retorne a localização inteira do objeto depois de definir todos os atributos e métodos.

Kaustubh J
fonte