AngularJS: что такое фабрика?

Я много работал над Angular.js и в целом считаю его интересным и мощным фреймворком.

Я знаю, что было много дискуссий о сервисах, фабриках, поставщиках и ценностях, но я все еще не совсем понимаю, что такое Factory.

Фабрика была определена в других обсуждениях StackOverflow следующим образом:

Фабрики

Синтаксис: module.factory( 'factoryName', function ); Результат: При объявлении factoryName в качестве вводимого аргумента вам будет предоставлено значение, которое возвращается при вызове ссылки на функцию, переданной в module.factory.

Я нахожу это объяснение очень трудным для понимания, и оно не увеличивает моего понимания того, что такое фабрика.

Кто-нибудь может поделиться какими-либо объяснениями или примерами из реальной жизни о том, что такое Factory и почему вы должны использовать его вместо Service, Provider или другого?

Обновлять

service содержит ссылку на любой объект.

factory это функция, которая возвращает любой объект

provider это функция, которая возвращает любую функцию

-тьфу-


person Code Whisperer    schedule 16.05.2013    source источник
comment
Я бы не сказал, что это дубликат этого вопроса, скорее, я прочитал этот вопрос, прежде чем задать этот, поскольку его ответ на Factories (упомянутый выше) был немного запутанным. Некоторые из приведенных ниже ответов уменьшают Factories до чего-то, что даже я могу понять   -  person Code Whisperer    schedule 17.05.2013
comment
Этот вопрос имеет больше голосов, чем тот, который он дублирует, возможно, все должно быть наоборот?   -  person Code Whisperer    schedule 22.01.2015
comment
Эта ссылка хорошо объясняет это.   -  person Ahmed    schedule 29.11.2015


Ответы (4)


Насколько я понимаю, они все примерно одинаковые. Основные отличия заключаются в их сложности. Провайдеры настраиваются во время выполнения, фабрики немного надежнее, а сервисы — самая простая форма.

Ознакомьтесь с этим вопросом AngularJS: сервис, поставщик или фабрика

Также этот суть может быть полезен для понимания тонких различий.

Источник: https://groups.google.com/forum/#!topic/angular/hVrkvaHGOfc

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

автор: Павел Козловский

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()];
}​
person Jonathan Palumbo    schedule 16.05.2013
comment
Итак, один из способов взглянуть на них, это то, что они идут в порядке сложности Provider > Factory > Service > Value? - person Code Whisperer; 17.05.2013
comment
Это один способ взглянуть на это, другой — думать о Factory и Service как об абстракциях Provider. Кто-то поправит меня, если я ошибаюсь, но Factory и Service используют Provider под капотом. Вот почему обеспечивайте наиболее близкую к металлу версию. Я считаю, что Value — это способ определения констант, которые затем можно использовать во всем приложении. - person Jonathan Palumbo; 17.05.2013

Одно важное отличие, которое я вижу, заключается в том, что вы можете запускать собственный код на заводе. Но в сервисе происходит только создание объекта.

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

    //Write custom code here

    return {
            Hello: function() {
            return "Hello, World!"
        }
    };
});
person Hariprasad    schedule 16.05.2013
comment
вы также можете запустить собственный код в функции конструктора службы, не так ли? никто не сказал внутри функции конструктора, вы не можете запустить другой код - person nonopolarity; 29.02.2016

Мои два цента на эту тему. Я очень-очень новичок и только начинаю понимать Angular JS, и это было одной из вещей, которая меня сильно смутила, и поэтому я изучил ее довольно подробно. Я делаю заметки для интервью, и это может быть полезно для других.

  • сервис и фабрика делают одни и те же вещи по-разному
  • оба являются инъекционными
  • для большинства вещей используйте заводской синтаксис
  • легче понять
  • в настоящее время с es6 «сервис» выполняется, поскольку он лучше преобразуется в классы es6
  • по сути, он абстрагирует бизнес-логику от контроллера
  • если вы используете бизнес-логику с контроллерами, вы можете использовать только с контроллерами
  • Контроллер предназначен для помещения данных в область действия, не обрабатывая длинную бизнес-логику.
  • так что в приведенном выше сценарии происходит то, что сложная бизнес-логика связана с контроллерами. Не для обработки данных. Так что поместите его кусочки в сервисы или на фабрику. Итак, ваш код компактный и модульный.
  • сервисы являются синглтонами
person bytise    schedule 13.03.2016

Службы — это в основном объекты, в которых вы описываете класс конструктора объекта. Где-то глубоко внутри фреймворка вызывается функция Object.create(), после чего вы можете использовать сервис, вызывая его объект и методы с помощью контроллера. Фабрика, с другой стороны, не создает объект по умолчанию и, следовательно, требует, чтобы вы возвращали полное местоположение объекта после того, как вы закончите определение всех атрибутов и методов.

person Kaustubh J    schedule 02.06.2018