AngularJS:ファクトリーとは何ですか?


101

私は多くの作業を行ってきましたがAngular.js、全体として、それは興味深い強力なフレームワークであることがわかりました。

サービスとファクトリー、プロバイダーとバリューについて多くの議論があったことは知っていますが、それが何であるかについてはまだかなり混乱していFactoryます。

ファクトリは、他のStackOverflowディスカッションで次のように定義されています。

工場

構文:module.factory( 'factoryName', function );結果:factoryNameを注入可能な引数として宣言すると、module.factoryに渡された関数参照を呼び出すことによって返される値が提供されます。

この説明は理解するのが非常に難しいと思います、そしてそれは工場が何であるかについての私の理解を増しません。

うの誰もが正確に何についての共有への説明や実際の生活の例を持ってFactoryいると、なぜあなたがの代わりにそれを使用する必要がありますServiceProviderまたは他の?

更新

A service 任意のオブジェクトの参照保持します

A factory 任意のオブジェクトを返す関数です

A provider 任意の関数を返す関数です

- あー -


6
これがその質問の複製であるとは言いません。むしろ、その質問Factories(上記の引用)が少し混乱するので、この質問をする前にその質問を読みました。以下の回答の一部は、Factories私が理解できるものでさえ、何かに還元されます
Code Whisperer

1
この質問には、「重複」する質問よりも多くの賛成票があります。おそらく、その逆のはずです。
Code Whisperer

3
このリンクはそれをよく説明しています。
アーメド

回答:


70

私が理解していることから、それらはすべてほぼ同じです。主な違いはそれらの複雑さです。プロバイダーは実行時に構成可能で、ファクトリーはもう少し堅牢で、サービスは最も単純な形式です。

この質問をチェックしてくださいAngularJS:サービスvsプロバイダーvsファクトリー

また、この要点は微妙な違いを理解するのに役立ちます。

出典: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()];
}​

だからそれらを見る一つの方法は、それらが複雑さの順に行くということProvider > Factory > Service > Valueですか?
Code Whisperer 2013年

2
それはそれを見る1つの方法ですが、別の方法は、ファクトリーとサービスをプロバイダーの抽象化と考えることです。私が間違っている場合は誰かが私を修正しますが、工場とサービスは内部でプロバイダーを使用します。これが、「金属に最も近い」バージョンが提供される理由です。Valueは、アプリケーション全体で使用できる定数を定義する方法だと思います。
ジョナサンパルンボ2013年

18

私が目にする大きな違いの1つは、ファクトリでカスタムコードを実行できることです。ただし、サービスでは、オブジェクトの作成のみが行われます。

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

    //Write custom code here

    return {
            Hello: function() {
            return "Hello, World!"
        }
    };
});

1
サービスコンストラクター関数でカスタムコードを実行することもできますか。誰もコンストラクタ関数の中で言っていない、他のコードを実行することはできない
非極性

9

このトピックに関する私の2セント。私は非常に非常に初心者で、Angular JSを理解するのが大好きで、これは私を混乱させるものの1つでした。私はインタビューを行うためのメモをとっていますが、これは他の人に役立つかもしれません。

  • サービスと工場は同じことを異なる方法で行います
  • どちらも注射剤です
  • ほとんどの場合、ファクトリ構文を使用します
  • 理解しやすい
  • es6では、es6クラスに変換するため、「サービス」が実行されます。
  • 本質的にコントローラーからビジネスロジックを抽象化します
  • コントローラでビジネスロジックを使用する場合、コントローラでのみ使用できます
  • コントローラは、長いビジネスロジックを処理しないスコープにデータを配置するためのものです
  • 上記のシナリオでは、複雑なビジネスロジックがコントローラーに結び付けられています。データ処理用ではありません。ですから、サービスの一部または工場にそれを少しずつ入れてください。したがって、コードは無駄がなくモジュール化されています。
  • サービスはシングルトンです

0

サービスはほとんどの場合、オブジェクトのコンストラクタクラスを記述するオブジェクトです。フレームワーク内のどこかでObject.create()関数が呼び出され、コントローラーを使用してそのオブジェクトとメソッドを呼び出すことにより、サービスを使用できます。一方、ファクトリはデフォルトではオブジェクトを作成しないため、すべての属性とメソッドの定義が完了したら、オブジェクトの場所全体を返す必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.