しばらくお待ちください。他にも以下のような答えがあるのは承知しています。AngularJS: サービス vs プロバイダー vs ファクトリー
しかし、工場よりもサービスを使用するタイミングがまだわかりません。
私の知る限り、ファクトリーは、複数のコントローラーから呼び出すことができる「共通」関数を作成するためによく使用されます。共通コントローラ関数の作成
Angular のドキュメントでは、サービスよりもファクトリーが好まれているようです。ファクトリーを使用するときに「サービス」とさえ呼ばれており、さらに混乱を招きます。http://docs.angularjs.org/guide/dev_guide.services.creating_services
では、いつサービスを利用するのでしょうか?
サービスによってのみ可能になる、またはサービスによってのみはるかに簡単に実行できるものはありますか?
舞台裏で何か違うことが起きているのでしょうか? パフォーマンスやメモリの違いでしょうか?
ここに例があります。宣言方法以外は同じように見えますが、なぜ一方ではなく他方を実行するのかわかりません。http://jsfiddle.net/uEpkE/
更新: Thomas の回答から、サービスはより単純なロジック用で、ファクトリーはプライベート メソッドを使用したより複雑なロジック用であることが示唆されているようです。そのため、以下のフィドル コードを更新したところ、どちらもプライベート関数をサポートできるようです。
myApp.factory('fooFactory', function() {
var fooVar;
var addHi = function(foo){ fooVar = 'Hi '+foo; }
return {
setFoobar: function(foo){
addHi(foo);
},
getFoobar:function(){
return fooVar;
}
};
});
myApp.service('fooService', function() {
var fooVar;
var addHi = function(foo){ fooVar = 'Hi '+foo;}
this.setFoobar = function(foo){
addHi(foo);
}
this.getFoobar = function(){
return fooVar;
}
});
function MyCtrl($scope, fooService, fooFactory) {
fooFactory.setFoobar("fooFactory");
fooService.setFoobar("fooService");
//foobars = "Hi fooFactory, Hi fooService"
$scope.foobars = [
fooFactory.getFoobar(),
fooService.getFoobar()
];
}
ベストアンサー1
説明
ここにはさまざまなものがあります:
初め:
- サービスを使用すると、関数のインスタンス("
this
" キーワード) が取得されます。 - ファクトリを使用すると、関数参照(ファクトリ内の return ステートメント) を呼び出すことによって返される値を取得します。
参照: angular.service と angular.factory
2番目:
AngularJS のすべてのプロバイダー (値、定数、サービス、ファクトリー) はシングルトンであることに留意してください。
三番目:
どちらか一方 (サービスまたはファクトリー) を使用するかどうかは、コード スタイルによって異なります。ただし、AngularJS では、ファクトリーを使用するのが一般的です。
なぜ ?
なぜなら、 「ファクトリ メソッドは、AngularJS 依存性注入システムにオブジェクトを取り込む最も一般的な方法です。非常に柔軟性が高く、高度な作成ロジックを含めることができます。ファクトリは通常の関数であるため、新しいレキシカル スコープを利用して「プライベート」変数をシミュレートすることもできます。特定のサービスの実装の詳細を隠すことができるため、これは非常に便利です。」
(参照:http://www.amazon.com/Mastering-Web-Application-Development-AngularJS/dp/1782161821)。
使用法
サービス:()
注入された関数参照に追加するだけで呼び出すことができるユーティリティ関数を共有するのに便利です。またはinjectedArg.call(this)
同様のものを使用して実行することもできます。
Factory:インスタンスを作成するために new できる 'class' 関数を返すのに役立ちます。
したがって、サービスに複雑なロジックがあり、その複雑さを公開したくない場合は、ファクトリーを使用します。
それ以外の場合、サービスのインスタンスを返す場合は、 service を使用します。
しかし、時間が経てば、80% のケースで factory を使用することになると思います。
詳細については:http://blog.manishchhabra.com/2013/09/angularjs-service-vs-factory-with-example/
アップデート :
ここに素晴らしい投稿があります:http://iffycan.blogspot.com.ar/2013/05/angular-service-or-factory.html
「関数を通常の関数のように呼び出す場合は、factoryを使用します。関数を new 演算子でインスタンス化する場合は、 service を使用します。違いがわからない場合は、 factory を使用します。」
アップデート :
AngularJS チームが作業を行い、説明します。http://docs.angularjs.org/guide/providers
そしてこのページから:
「Factory と Service は最もよく使用されるレシピです。これらの唯一の違いは、Service レシピはカスタム タイプのオブジェクトに適しているのに対し、Factory は JavaScript プリミティブと関数を生成できることです。」