这里有更多的服务与工厂的例子,这些例子可能有助于了解它们之间的区别。基本上,一个服务调用了“new…”,它已经被实例化了。工厂不会自动实例化。
基本的例子
返回一个只有一个方法的类对象
下面是一个只有一个方法的服务:
angular.service('Hello', function () {
this.sayHello = function () { /* ... */ };
});
下面是一个工厂,它返回一个带有方法的对象:
angular.factory('ClassFactory', function () {
return {
sayHello: function () { /* ... */ }
};
});
返回一个值
返回数字列表的工厂:
angular.factory('NumberListFactory', function () {
return [1, 2, 3, 4, 5];
});
console.log(NumberListFactory);
一个返回数字列表的服务:
angular.service('NumberLister', function () {
this.numbers = [1, 2, 3, 4, 5];
});
console.log(NumberLister.numbers);
这两种情况下的输出是相同的,都是数字列表。
先进的例子
使用工厂“分类”变量
在这个例子中,我们定义了一个CounterFactory,它增加或减少一个计数器,你可以得到当前的计数或已经创建了多少个CounterFactory对象:
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;
};
}
})
我们使用CounterFactory创建多个计数器。我们可以访问class变量来查看创建了多少个计数器:
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());
这段代码的输出是:
people 0
people 1
counters 1
places 0
counters 2
counters 2