Inilah yang membantu saya memahami perbedaannya, berkat posting blog oleh Pascal Precht.
Layanan adalah metode pada modul yang mengambil nama dan fungsi yang mendefinisikan layanan. Anda dapat menyuntikkan dan menggunakan layanan khusus itu di komponen lain, seperti pengontrol, arahan dan filter. Pabrik adalah metode pada modul dan juga membutuhkan nama dan fungsi, yang mendefinisikan pabrik. Kami juga dapat menyuntikkan dan menggunakannya dengan cara yang sama kami lakukan dengan layanan.
Objek yang dibuat dengan menggunakan nilai properti prototipe dari fungsi konstruktor mereka sebagai prototipe mereka, jadi saya menemukan kode Angular yang memanggil Object.create (), yang saya percaya adalah fungsi konstruktor layanan ketika akan dipakai. Namun, fungsi pabrik sebenarnya hanya fungsi yang dipanggil, itulah sebabnya kita harus mengembalikan objek literal untuk pabrik.
Berikut adalah kode sudut 1,5 yang saya temukan untuk pabrik:
var needsRecurse = false;
var destination = copyType(source);
if (destination === undefined) {
destination = isArray(source) ? [] : Object.create(getPrototypeOf(source));
needsRecurse = true;
}
Cuplikan kode sumber sudut untuk fungsi factory ():
function factory(name, factoryFn, enforce) {
return provider(name, {
$get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn
});
}
Dibutuhkan nama dan fungsi pabrik yang dilewati dan mengembalikan penyedia dengan nama yang sama, yang memiliki metode $ get yang merupakan fungsi pabrik kami. Setiap kali Anda meminta injector untuk ketergantungan tertentu, ia pada dasarnya meminta penyedia terkait untuk sebuah instance dari layanan itu, dengan memanggil metode $ get (). Karena itulah diperlukan $ get () saat membuat penyedia.
Berikut adalah kode 1,5 sudut untuk layanan.
function service(name, constructor) {
return factory(name, ['$injector', function($injector) {
return $injector.instantiate(constructor);
}]);
}
Ternyata ketika kita memanggil service (), sebenarnya memanggil factory ()! Namun, tidak hanya meneruskan fungsi konstruktor layanan kami ke pabrik apa adanya. Itu juga melewati fungsi yang meminta injektor untuk instantiate objek oleh konstruktor yang diberikan.
Dengan kata lain, jika kita menyuntikkan MyService di suatu tempat, yang terjadi dalam kode adalah:
MyServiceProvider.$get(); // return the instance of the service
Untuk menyatakannya kembali, sebuah layanan memanggil sebuah pabrik, yang merupakan metode $ get () pada penyedia terkait. Selain itu, $ injector.instantiate () adalah metode yang akhirnya memanggil Object.create () dengan fungsi konstruktor. Itu sebabnya kami menggunakan "ini" dalam layanan.
Untuk ES5 tidak masalah yang kami gunakan: service () atau factory (), itu selalu merupakan pabrik yang disebut yang menciptakan penyedia untuk layanan kami.
Anda dapat melakukan hal yang sama persis dengan layanan juga. Layanan adalah fungsi konstruktor, namun, itu tidak mencegah kita mengembalikan objek literal. Jadi kita dapat mengambil kode layanan kami dan menuliskannya dengan cara yang pada dasarnya melakukan hal yang sama persis seperti pabrik kami atau dengan kata lain, Anda dapat menulis layanan sebagai pabrik untuk mengembalikan objek.
Mengapa kebanyakan orang merekomendasikan untuk menggunakan pabrik di atas layanan? Ini adalah jawaban terbaik yang pernah saya lihat yang berasal dari buku Pawel Kozlowski: Menguasai Pengembangan Aplikasi Web dengan AngularJS.
Metode pabrik adalah cara paling umum untuk memasukkan objek ke sistem injeksi ketergantungan AngularJS. Ini sangat fleksibel dan dapat berisi logika kreasi yang canggih. Karena pabrik adalah fungsi reguler, kita juga dapat memanfaatkan ruang lingkup leksikal baru untuk mensimulasikan variabel "pribadi". Ini sangat berguna karena kami dapat menyembunyikan detail implementasi layanan yang diberikan. "