В этом разница между сервисами и фабриками?

Один из самых ярких примеров, которые я читал об услугах/фабриках/поставщиках, заключался в том, что они соответствовали: машине, фабрике, которая производит автомобили (например, красную машину, синюю машину), и настраиваемой фабрике, которая производит автомобили (например, высококачественные). автомобили, некачественные автомобили)

Часть, которая меня смущает, - это объяснение «все одноэлементное». Из приведенного выше примера я предположил, что «сервис» — это синглтон, который возвращает сам себя, а фабрика и провайдер — это синглтоны, которые возвращают объекты (каждый из которых уникален). То есть, если бы у одного контроллера была синяя машина, а у другого — красная, то это были бы две разные машины.

Я думаю, что путаница возникает из-за того, что фабрики пишутся двумя разными способами. В одном случае вы возвращаете объект. Это делает его функционально эквивалентным «сервису». В другом случае вы возвращаете функцию, которая является экземпляром объекта, так что все, что использует эту фабрику, может получить новые отдельные экземпляры.

Это верно? Является ли какой-либо из двух методов написания фабрики анти-шаблоном?


person user2483724    schedule 19.03.2014    source источник
comment
возможный дубликат Angular.js: сервис против поставщика против завода?   -  person hassassin    schedule 19.03.2014
comment
Я очень надеюсь, что они исправят это в Angular2. Это слишком сложно, без реальной пользы, которую я вижу. Внутренне все подходы в любом случае вызывают factory.   -  person Matt Greer    schedule 19.03.2014
comment
я совсем не нахожу это сложным, у вас есть фабрика, которая что-то возвращает, и служба, которая возвращает конструктор, который хорош для классического подхода. Я использую фабрику как раскрывающий шаблон модуля.   -  person David Chase    schedule 19.03.2014
comment
@MattGreer Я думаю, вы имеете в виду, что внутри все обращаются к провайдеру звонков. Мне пришлось прочитать эту статью пять раз, но в конце концов я понял [я думаю]: joelhooks.com/blog/2013/08/18/ По сути, factory использует новое ключевое слово, а сервис - нет. Я не имею ни малейшего представления о том, как это повлияет на практическое развитие.   -  person JeffryHouser    schedule 19.03.2014
comment
Да, есть куча потоков, в которых говорится о разнице между службами angular, но ни один из них конкретно не касается того, как фабрику можно использовать по-разному. Самый распространенный пример просто показывает, что сервис/фабрика одинаковы, один использует это, другой возвращает объект.   -  person user2483724    schedule 19.03.2014
comment
@JeffryHouser Да, провайдер, спасибо. Я могу оценить аргументы в пользу наличия всех трех. Но я верю, что если бы Angular дал нам только provider, почти все были бы в порядке и даже не заметили бы, что чего-то не хватает.   -  person Matt Greer    schedule 20.03.2014


Ответы (2)


Из блога, который я написал специально, чтобы ответить на этот вопрос:

Итак, вот оно. Я подведу итог, а затем приведу несколько примеров:

  • Используйте службу, если вы хотите передать функцию-конструктор. Функция будет вызываться с помощью «нового» оператора, и результат будет сохранен.
  • Используйте фабрику, когда вы хотите вернуть объект из функции (т. е. шаблон фабрики). Функция будет вызвана, а результат сохранен.
  • Используйте провайдера, если вы хотите предоставить конфигурацию модуля для вашего объекта, прежде чем сделать его доступным.

Зачем иметь несколько путей? В первую очередь потому, что некоторые системы, основанные на JavaScript, такие как TypeScript и CoffeeScript, генерируют код, который диктует один подход по сравнению с другим, поэтому он существует для гибкости.

Полный текст сообщения с примерами: http://csharperimage.jeremylikness.com/2014/01/understanding-providers-services-and.html

person Jeremy Likness    schedule 19.03.2014
comment
Таким образом, использование factory для возврата функции (а не объекта, как обычно) и, таким образом, возможность создания экземпляра того, что он возвращает, не должно использоваться и является взломом? - person user2483724; 20.03.2014
comment
Имена плохие имена. Фабрика означает использование фабрики для настройки сервиса, а сервис означает использование конструктора. Они оба заканчиваются синглтонами. Если вы хотите создать свою собственную фабрику, вы все равно можете использовать любой метод. Служба может иметь функцию с функцией, которая возвращает новые экземпляры, а фабрика может возвращать свою собственную функцию, которая возвращает новые экземпляры. - person Jeremy Likness; 20.03.2014
comment
А, я вижу, служба также может помочь вам создать новые экземпляры, если это необходимо. Слово «фабрика» для меня слишком сильно ассоциировалось с созданием новых объектов. Спасибо, что прояснили это. (Объяснение поддержки typescript/coffeescript тоже было хорошим!_ - person user2483724; 20.03.2014
comment
Да, вот скрипт, демонстрирующий использование службы и фабрики в Angular как для служб, так и для фабрик. jsfiddle.net/jeremylikness/7dUyf - person Jeremy Likness; 20.03.2014

То, что я видел в отношениях с фабрикой, является эквивалентом раскрывающегося шаблона проектирования модуля в Javascript.

Шаблон проектирования модуля — Сингелтон:

var x = (function() {
    var y = 1,

    zMethod = function() {
       return y + y;
    }

    return {
       y: y,
       z: zMethod 
    }

}());

Угловой завод:

angular.module('app', [])
    .factory('x', function() {
        var y = 1,
        zMethod = function() { return y + y; }

        return {
            y: y,
            z: zMethod
        }
    });

Помогает прояснить, что происходит за кулисами... Но это только одна из трех частей!

person Sten Muchow    schedule 19.03.2014