Saya tahu pertanyaan ini sudah lama tetapi saya ingin menambahkan lima sen saya,
Saya pikir injeksi ketergantungan (DI) dalam banyak hal seperti Pola Pabrik yang dapat dikonfigurasi (FP), dan dalam hal apa pun yang dapat Anda lakukan dengan DI, Anda akan dapat melakukannya dengan pabrik tersebut.
Sebenarnya, jika Anda menggunakan pegas misalnya, Anda memiliki opsi untuk sumber daya autowiring (DI) atau melakukan sesuatu seperti ini:
MyBean mb = ctx.getBean("myBean");
Dan kemudian gunakan contoh 'mb' untuk melakukan apa saja. Bukankah itu panggilan ke pabrik yang akan mengembalikan Anda sebuah contoh ??
Satu-satunya perbedaan nyata yang saya perhatikan antara sebagian besar contoh FP adalah bahwa Anda dapat mengonfigurasi apa "myBean" yang ada di xml atau di kelas lain, dan kerangka kerja akan berfungsi sebagai pabrik, tetapi selain itu adalah hal yang sama, dan Anda dapat memiliki Pabrik yang pasti membaca file konfigurasi atau mendapatkan implementasi sesuai kebutuhan.
Dan jika Anda meminta pendapat saya (dan saya tahu Anda tidak), saya percaya bahwa DI melakukan hal yang sama tetapi hanya menambah kompleksitas pada pengembangan, mengapa?
baik, untuk satu hal, agar Anda tahu apa implementasi yang digunakan untuk kacang yang Anda autowire dengan DI, Anda harus pergi ke konfigurasi itu sendiri.
tapi ... bagaimana dengan janji itu bahwa Anda tidak perlu tahu implementasi objek yang Anda gunakan? pfft! serius? ketika Anda menggunakan pendekatan seperti ini ... bukankah Anda sama dengan yang menulis implementasinya ?? dan bahkan jika tidak, bukankah Anda hampir setiap saat melihat bagaimana implementasi melakukan apa yang seharusnya dilakukan ??
dan untuk satu hal terakhir, tidak masalah seberapa banyak kerangka kerja DI menjanjikan Anda bahwa Anda akan membangun hal-hal yang terpisah darinya, tanpa ada ketergantungan pada kelas mereka, jika Anda menggunakan kerangka kerja Anda membangun semuanya dengan cepat, jika Anda harus mengubah pendekatan atau kerangka kerja itu tidak akan menjadi tugas yang mudah ... PERNAH! ... tetapi, karena Anda membangun segala sesuatu di sekitar kerangka kerja itu alih-alih mengkhawatirkan solusi terbaik untuk bisnis Anda, maka Anda akan menghadapi masalah besar saat melakukan itu.
Bahkan, satu-satunya aplikasi bisnis nyata untuk pendekatan FP atau DI yang dapat saya lihat adalah jika Anda perlu mengubah implementasi yang digunakan saat runtime , tetapi setidaknya kerangka kerja yang saya tahu tidak memungkinkan Anda untuk melakukan itu, Anda harus meninggalkan semuanya sempurna dalam konfigurasi pada waktu pengembangan dan jika Anda memerlukannya, gunakan pendekatan lain.
Jadi, jika saya memiliki kelas yang berkinerja berbeda dalam dua lingkup dalam aplikasi yang sama (katakanlah, dua perusahaan holding) saya harus mengkonfigurasi kerangka kerja untuk membuat dua kacang yang berbeda, dan menyesuaikan kode saya untuk menggunakan masing-masing. Bukankah itu sama dengan jika saya hanya akan menulis sesuatu seperti ini:
MyBean mb = MyBeanForEntreprise1(); //In the classes of the first enterprise
MyBean mb = MyBeanForEntreprise2(); //In the classes of the second enterprise
sama seperti ini:
@Autowired MyBean mbForEnterprise1; //In the classes of the first enterprise
@Autowired MyBean mbForEnterprise2; //In the classes of the second enterprise
Dan ini:
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise1"); //In the classes of the first enterprise
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise2"); //In the classes of the second enterprise
Bagaimanapun Anda harus mengubah sesuatu dalam aplikasi Anda, apakah kelas atau file konfigurasi, tetapi Anda harus melakukannya dan memindahkannya.
Bukankah lebih baik melakukan sesuatu seperti ini:
MyBean mb = (MyBean)MyFactory.get("mb");
Dan dengan cara itu, Anda mengatur kode pabrik untuk mendapatkan implementasi yang tepat saat runtime tergantung pada perusahaan pengguna yang dicatat ?? Sekarang itu akan sangat membantu. Anda bisa menambahkan tabung baru dengan kelas-kelas baru dan mengatur aturan bahkan mungkin saat runtime (atau menambahkan file konfigurasi baru jika Anda membiarkan opsi ini terbuka), tidak ada perubahan pada kelas yang ada. Ini akan menjadi pabrik yang Dinamis!
bukankah itu lebih bermanfaat daripada harus menulis dua konfigurasi untuk setiap perusahaan, dan mungkin bahkan memiliki dua aplikasi yang berbeda untuk masing-masing ??
Anda dapat memberi tahu saya, saya tidak perlu melakukan pergantian saat runtime, jadi saya mengkonfigurasi aplikasi, dan jika saya mewarisi kelas atau menggunakan implementasi lain, saya hanya mengubah konfigurasi dan memindahkan. Ok, itu juga bisa dilakukan dengan pabrik. Dan jujur, berapa kali Anda melakukan ini? mungkin hanya ketika Anda memiliki aplikasi yang akan digunakan di tempat lain di perusahaan Anda, dan Anda akan meneruskan kode ke tim lain, dan mereka akan melakukan hal-hal seperti ini. Tapi hei, itu juga bisa dilakukan dengan pabrik, dan akan lebih baik dengan pabrik yang dinamis !!
Pokoknya, bagian komentar jika terbuka bagimu untuk membunuhku.