angular 之 Service 和 Factory的区别

对于 service 和factory 的实现

function factory(name, factoryFn) { return provider(name, { $get: factoryFn }); }

function service(name, constructor) {
    return factory(name, ['$injector', function($injector) {
        // 
      return $injector.instantiate(constructor);
    }]);
  }


对于 factory 是调用 provider 实现的,

对于service 是调用factrory  方法,但是 关注到 $injector.instantiate ,在这个函数里面 servide会接收一个由$injector 实用new 关键字实例化的一个构造器对象。

对于同一个功能的service 和factory

var app = angular.module('app',[]);
 
app.service('helloWorldService', function(){
    this.hello = function() {
        return "Hello World";
    };});
 
app.factory('helloWorldFactory', function(){
    // 返回的是  {} 对象集合 
    return {
        hello: function() {
            return "Hello World";
        }
    }});


但是factory 对于service 更加灵活些,因为他可以使用new关键词返回函数

Factories offer slightly more flexibility than services because they can return functions which can then be new'd

所以从面向对象编程的工厂模式来说,一个factory 可以是一个用于创建其它对象的对象。

app.factory('helloFactory', function() {
    //  返回的是一个 function 
    return function(name) {
        this.name = name;
 
        this.hello = function() {
            return "Hello " + this.name;
        };
    };
});

而在使用的时候

app.controller('helloCtrl', function($scope, helloWorldService, helloWorldFactory, helloFactory) {
    init = function() {
    // 返回的是一个对象 
      helloWorldService.hello(); //'Hello World'
     // 返回的是一个 对象
      helloWorldFactory.hello(); //'Hello World'
      // 返回的是一个 函数 
      new helloFactory('Readers').hello() //'Hello Readers'
 
    }
    init();
});

Factory更加适用于当你在设计一个需要私有方法的类的时候使用

app.factory('privateFactory', function(){
    // 私有实现 
    var privateFunc = function(name) {
        return name.split("").reverse().join(""); //reverses the name
    };
 
    return {
        hello: function(name){
          return "Hello " + privateFunc(name);
        }
    };});

在这个例子中privateFactory含有一个不能被外部访问的私有privateFunc函数。这种使用方式services也可以实现,但是使用Factory代码结构显得更加清晰。

你可能感兴趣的:(angular 之 Service 和 Factory的区别)