Hier sind einige weitere Beispiele für Dienstleistungen und Fabriken, die den Unterschied zwischen ihnen verdeutlichen können. Grundsätzlich wird bei einem Dienst "new ..." aufgerufen, er ist bereits instanziiert. Eine Fabrik wird nicht automatisch instanziiert.
Grundlegende Beispiele
Rückgabe eines Klassenobjekts, das eine einzige Methode hat
Hier ist ein Dienst, der eine einzige Methode hat:
angular.service('Hello', function () {
this.sayHello = function () { /* ... */ };
});
Hier ist eine Fabrik, die ein Objekt mit einer Methode zurückgibt:
angular.factory('ClassFactory', function () {
return {
sayHello: function () { /* ... */ }
};
});
Rückgabe eines Wertes
Eine Fabrik, die eine Liste von Zahlen zurückgibt:
angular.factory('NumberListFactory', function () {
return [1, 2, 3, 4, 5];
});
console.log(NumberListFactory);
Ein Dienst, der eine Liste von Zahlen zurückgibt:
angular.service('NumberLister', function () {
this.numbers = [1, 2, 3, 4, 5];
});
console.log(NumberLister.numbers);
Die Ausgabe ist in beiden Fällen die gleiche, nämlich eine Liste von Zahlen.
Fortgeschrittene Beispiele
"Klassen"-Variablen mit Hilfe von Fabriken
In diesem Beispiel definieren wir eine CounterFactory, die einen Zähler inkrementiert oder dekrementiert, und Sie können den aktuellen Zählerstand abfragen oder ermitteln, wie viele CounterFactory-Objekte erstellt worden sind:
angular.factory('CounterFactory', function () {
var number_of_counter_factories = 0; // class variable
return function () {
var count = 0; // instance variable
number_of_counter_factories += 1; // increment the class variable
// this method accesses the class variable
this.getNumberOfCounterFactories = function () {
return number_of_counter_factories;
};
this.inc = function () {
count += 1;
};
this.dec = function () {
count -= 1;
};
this.getCount = function () {
return count;
};
}
})
Wir verwenden die CounterFactory
um mehrere Zähler zu erstellen. Wir können auf die Klassenvariable zugreifen, um zu sehen, wie viele Zähler erstellt wurden:
var people_counter;
var places_counter;
people_counter = new CounterFactory();
console.log('people', people_counter.getCount());
people_counter.inc();
console.log('people', people_counter.getCount());
console.log('counters', people_counter.getNumberOfCounterFactories());
places_counter = new CounterFactory();
console.log('places', places_counter.getCount());
console.log('counters', people_counter.getNumberOfCounterFactories());
console.log('counters', places_counter.getNumberOfCounterFactories());
Die Ausgabe dieses Codes ist:
people 0
people 1
counters 1
places 0
counters 2
counters 2