Dalam beberapa kode saya, saya memiliki pabrik statis yang mirip dengan ini:
public class SomeFactory {
// Static class
private SomeFactory() {...}
public static Foo createFoo() {...}
public static Foo createFooerFoo() {...}
}
Selama tinjauan kode, diusulkan bahwa ini haruslah singleton dan disuntikkan. Jadi, akan terlihat seperti ini:
public class SomeFactory {
public SomeFactory() {}
public Foo createFoo() {...}
public Foo createFooerFoo() {...}
}
Beberapa hal yang perlu diperhatikan:
- Kedua pabrik itu tidak memiliki kewarganegaraan.
- Satu-satunya perbedaan antara metode adalah cakupannya (contoh vs statis). Implementasinya sama.
- Foo adalah kacang yang tidak memiliki antarmuka.
Argumen yang saya miliki untuk menjadi statis adalah:
- Kelas tidak memiliki kewarganegaraan, oleh karena itu tidak perlu dipakai
- Tampaknya lebih alami untuk dapat memanggil metode statis daripada harus membuat instantiate pabrik
Argumen untuk pabrik sebagai singleton adalah:
- Bagus untuk menyuntikkan semuanya
- Meskipun kewarganegaraan pabrik, pengujian lebih mudah dengan injeksi (mudah dipermainkan)
- Itu harus diejek ketika menguji konsumen
Saya memiliki beberapa masalah serius dengan pendekatan singleton karena tampaknya menyarankan bahwa tidak ada metode yang seharusnya statis. Tampaknya juga menyarankan bahwa utilitas seperti StringUtils
harus dibungkus dan disuntikkan, yang tampaknya konyol. Terakhir, ini menyiratkan bahwa saya perlu mengejek pabrik pada titik tertentu, yang sepertinya tidak benar. Saya tidak bisa memikirkan kapan saya harus mengejek pabrik.
Apa yang dipikirkan komunitas? Meskipun saya tidak menyukai pendekatan tunggal, saya tampaknya tidak memiliki argumen yang sangat kuat menentangnya.
DateTime
dan File
kelas sangat sulit untuk diuji karena alasan yang persis sama. Jika Anda memiliki kelas misalnya yang menetapkan Created
tanggal DateTime.Now
dalam konstruktor, bagaimana Anda membuat tes unit dengan dua objek yang dibuat 5 menit terpisah? Bagaimana dengan tahun terpisah? Anda benar-benar tidak dapat melakukannya (tanpa banyak pekerjaan).
private
konstruktor dan getInstance()
metode? Maaf, pemetik nit yang tidak dapat diperbaiki!