Singleton vs Dependency Injection
… Dia bilang kalau aku cuma bisa jadi pahlawan palsu karena pedangku hanya tiruan. Kalau begitu aku tinggal menjadi Pahlawan Sejati, begitu pikirku … (Pahlawan Himmel — Frieren: Beyond Journey’s End)
Jadi selama beberapa tahun ini tertanam bahwa sebisa mungkin jangan menggunakan Singleton dalam sebuah Code, tapi ternyata nggak semua butuh menggunakan Dependency Injection dimana Singleton ternyata sangat powerfull pada beberapa case.
Hal ini bermula ketika mengembangkan sebuah SDK yang membutuhkan Camera sebagai liveness detection. Pada awal pengembangan nya Dependency Injection menjadi pilihan pertama sampai suatu saat, ketika masuk pada optimasi performa SDK ditemukan bahwa penggunaan memory nya selalu bertambah padahal SDK sudah di tutup.
Hmmmmm …shit happen !!!semakin lama aplikasi semakin berjalan lambat karena memory tidak direlease oleh RAM.
Setelah research beberapa kali dan mencari beberapa rootcause akhirnya ketemu, bahwa beberapa observer tidak di deallocated secara otomatis dan karena kita menggunakan Dependecy Injection kita perlu check satu persatu karena setiap class dibuat baru dia akan mengambil memory pada RAM.
Fucccckkkk …karena malas tracing satu-satu akhirnya mulai baca-baca lagi mengenai Singleton. Ketemulah artikel ini, jadi Singleton memastikan kalo kita hanya akan mempunya satu instance dan Camera manager merupakan salah satu yang sebenarnya hanya perlu di instance sekali (Selain Camera ada timer jg yang bisa menggunakan Singleton)
One of the main advantages of using the singleton pattern is that it can reduce the memory usage of your application. By creating only one instance of a class, you can avoid allocating and deallocating memory for multiple objects of the same type.
Oke …rewrite ulang code lama menggunakan Singleton. Jreeeeeeng …sekarang SDK bisa merelease alokasi memory ketika SDK di tutup. Walaupun sebenernya masih ada beberapa UI yang masih ke Hold dalam memory karena DSL yang sudah dibuat belum Optimal tapi pelan-pelan akan dioptimasi.
Dari gambar diatas CameraManager dan FrameManager hanya di instance sekali dan FaceCompareVC di deallocated ketika sudah tidak dibutuhkan :).