Service Locator adalah salah satu dari dua kejahatan yang bisa dikatakan. Yang "lebih rendah" yang mengarah ke empat perbedaan ini ( setidaknya saya tidak dapat memikirkan yang lain sekarang ):
Prinsip Tanggung Jawab Tunggal
Service Container tidak melanggar Prinsip Tanggung Jawab Tunggal seperti yang dilakukan Singleton. Singletons menggabungkan pembuatan objek dan logika bisnis, sedangkan Service Container bertanggung jawab secara ketat untuk mengelola siklus hidup objek aplikasi Anda. Dalam hal ini Service Container lebih baik.
Kopel
Singletons biasanya di-hardcode ke dalam aplikasi Anda karena panggilan metode statis, yang mengarah ke dependensi yang berpasangan erat dan sulit untuk dipalsukan dalam kode Anda. SL di sisi lain hanyalah satu kelas dan dapat disuntikkan. Jadi, sementara semua kelas Anda akan bergantung padanya, setidaknya itu adalah dependensi yang digabungkan secara longgar. Jadi, kecuali Anda menerapkan ServiceLocator sebagai Singleton itu sendiri, itu agak lebih baik dan juga lebih mudah untuk diuji.
Namun, semua kelas yang menggunakan ServiceLocator sekarang akan bergantung pada ServiceLocator, yang juga merupakan bentuk penggandengan. Ini dapat dikurangi dengan menggunakan antarmuka untuk ServiceLocator sehingga Anda tidak terikat ke implementasi ServiceLocator konkret tetapi kelas Anda akan bergantung pada keberadaan semacam Locator sedangkan tidak menggunakan ServiceLocator sama sekali meningkatkan penggunaan kembali secara dramatis.
Dependensi Tersembunyi
Masalah menyembunyikan ketergantungan sangat banyak muncul. Saat Anda baru saja memasukkan locator ke kelas konsumsi Anda, Anda tidak akan tahu dependensi apa pun. Namun berbeda dengan Singleton, SL biasanya akan membuat instance semua dependensi yang dibutuhkan di balik layar. Jadi, ketika Anda mengambil Layanan, Anda tidak berakhir seperti Misko Hevery dalam contoh CreditCard , misalnya Anda tidak perlu membuat contoh semua ketergantungan dependensi dengan tangan.
Mengambil dependensi dari dalam instance juga melanggar Law of Demeter , yang menyatakan bahwa Anda tidak boleh menggali kolaborator. Sebuah instance hanya boleh berbicara dengan kolaborator langsungnya. Ini masalah dengan Singleton dan ServiceLocator.
Status Global
Masalah Status Global juga agak berkurang karena ketika Anda membuat contoh Service Locator baru antara tes semua contoh yang dibuat sebelumnya akan dihapus juga (kecuali Anda membuat kesalahan dan menyimpannya dalam atribut statis di SL). Itu tidak berlaku untuk kondisi global mana pun di kelas yang dikelola oleh SL, tentu saja.
Juga lihat Fowler di Service Locator vs Dependency Injection untuk diskusi yang lebih mendalam.
Catatan tentang pembaruan Anda dan artikel yang ditautkan oleh Sebastian Bergmann tentang kode pengujian yang menggunakan Singletons : Sebastian sama sekali tidak menyarankan bahwa solusi yang diusulkan membuat penggunaan Singleons tidak terlalu menjadi masalah. Ini hanyalah satu cara untuk membuat kode yang tidak mungkin diuji lebih dapat diuji. Tapi itu masih kode bermasalah. Bahkan, dia secara eksplisit mencatat: "Hanya Karena Anda Bisa, Tidak Berarti Anda Harus".