Saya mencoba mencari tahu kapan harus menggunakan registri DIC / IoC untuk mengkonfigurasi perangkat lunak saya dan kapan harus menggunakan pabrik, bersama dengan alasan di balik kedua pendekatan tersebut.
Saya menggunakan StructureMap sebagai wadah DI saya (DIC), yang mudah dikonfigurasikan menggunakan pendaftar. Dalam DIC praktis semua objek yang terdaftar bersifat statis dalam arti, bahwa saya tidak perlu mengubah / menukar implementasi / instance pada saat runtime, setelah DIC dikonfigurasi dan mereka dikonfigurasi dalam DIC sebagai singleton. Namun, karena perangkat lunak saya (SW) akan berjalan pada perangkat yang berbeda, saya perlu memilih registri khusus perangkat tergantung pada perangkat yang menjalankan SW saya untuk mengkonfigurasi perangkat keras yang sesuai.
Karena pembangunan beberapa objek saya memerlukan pembacaan dalam file konfigurasi, saya menggunakan pabrik untuk mengembalikan instance ini ke DIC, untuk memisahkan pembacaan konfigurasi dari penciptaan objek. Saya mendaftarkan getter pabrik di DIC untuk jenis plugin yang sesuai.
Sekarang katakan saya memiliki jenis plugin IMotor
dengan jenis beton Motor1
dan Motor2
, yang harus ditangani oleh pabrik. Sekarang ada dua cara saya dapat memutuskan cara mengkonfigurasi perangkat saya:
- Saya meneruskan informasi tentang perangkat yang menjalankan SW ke
MotorFactory
dan mengembalikan motor yang benar, baikMotor1
atauMotor2
. Dalam hal ini logika untuk memutuskan ada di dalam Pabrik. - Saya mengkonfigurasi DIC sesuai dengan perangkat itu berjalan dan membuat dua pabrik
Motor1Factory
danMotor2Factory
, di mana satu menciptakanMotor1
dan yang lainnyaMotor2
. Dalam hal ini saya akan memiliki entri registri yang berbedaIMotor
di dalam pendaftar khusus perangkat yang menggunakan salah satuMotor1Factory
atauMotor2Factory
.
Sekarang pertanyaan saya adalah: Mana dari dua metode ini yang lebih disukai dan mengapa? Bagi saya, sepertinya kasus pertama tidak lurus ke depan dan berbelit-belit, karena saya menyebarkan logika yang memutuskan jenis apa yang akan dipakai di seluruh basis kode. Sedangkan dalam kasus kedua saya secara efektif mengalikan jumlah pabrik dalam kode saya, karena saya akan membutuhkan pabrik untuk (hampir) setiap jenis beton. Menjadi lebih membingungkan bagi saya, ketika pabrik-pabrik abstrak ditambahkan ke dalam campuran.
Jadi sekali lagi: Kapan saya harus menggunakan satu metode atau yang lain? Dan yang lebih penting: Apa indikator yang baik untuk memutuskan jalan mana yang harus ditempuh?
sumber
Jawaban:
Jika Anda menggunakan keduanya, saya akan menggunakan sesuatu yang sederhana:
sumber
Pabrik abstrak digunakan ketika Anda memiliki objek yang terkait melalui hierarki yang perlu bervariasi bersama. Saya tidak melihatnya di sini.
Yang saya lihat adalah Anda bertanya-tanya apakah pabrik harus memilih motor atau apakah DIC harus memilih pabrik yang memproduksi motor tertentu.
Sulit untuk memilih dengan tepat karena pabrik dan DIC melakukan hal yang sangat mirip. Perbedaannya adalah pabrik difokuskan pada masalah tertentu dan DIC lebih umum.
Itu muncul ke pertanyaan ini: apakah Anda memiliki kebutuhan untuk kode yang khusus untuk masalah ini yang akan tinggal di pabrik? Atau apakah ini lebih umum seperti membaca detail konfigurasi dari suatu file?
Ingatlah bahwa meskipun Anda mungkin hanya memilih antara
Motor1
danMotor2
hari ini, besok mungkin ada aMotor3
. Mendukung desain yang akan membuatMotor3
mudah ditambahkan.sumber
Saya akan memisahkan logika "motor mana yang harus digunakan" menjadi Pabrik khusus yang disebut Builder (pola) dan menggunakan IOC-Container untuk kedua motor sebagai implementasi detail dari pembangun.
Sebagai aturan umum:
sumber