220 likes | 361 Views
Singleton Pattern. 1. uno. one. What is Singleton ?. One object of a kind Ada class yang hanya perlu diinstansiasi 1 kali saja Alasan : Dalam beberapa kasus hanya dibutuhkan 1 object saja. Like What ?. Database Connection. Dalam banyak kasus , koneksi database cukup satu saja
E N D
Singleton Pattern 1 uno one
What is Singleton ? • One object of a kind • Ada class yang hanyaperludiinstansiasi 1 kali saja • Alasan: Dalambeberapakasushanyadibutuhkan 1 object saja
Like What ? • Database Connection Dalambanyakkasus, koneksi database cukupsatusaja Misal : hanya 1 lisensikoneksi
Else ? • Application Setting (Preferences) Beberapabagian program yang berbedaakanmembacadanmenulis setting
More ? • Logging activities Beberapabagian program perlumenuliske file log yang sama
Singleton • Memastikansuatu class hanyadapat “menghasilkan” satu object saja • Konsepnyamirip global variable (denganperbedaan) • Pada Singleton, object hanyadibuatsaatdibutuhkan, sedangkan Global Variable dibuatsaatawal program dijalankan
Public ! Bagaimanajika default ? public class Whatever { … } Bagaimanacaramembuat object dari class Whatever ? Whatever object1 = new Whatever(); Bisamembuatlebihdari 1 object ? Whatever object1 = new Whatever(); Whatever object2 = new Whatever(); … Whatever object100 = new Whatever();
Hanyadapatdiaksesdari package yang sama ! class Whatever { … } Tetapbisadibuatlebihdari 1 object dari class Whatever Whatever object1 = new Whatever(); Whatever object2 = new Whatever(); … Whatever object100 = new Whatever(); Object membutuhkan memory, semakinbanyak object ?
Tahukahanda, kitadapatmelakukanini public class Whatever { private Whatever() { } } Private Constructor ! Apakonsekuensinya ? Hubungannyadengan Singleton ?
Masihingatkonsepstatic method ? public class Whatever { public static void hitung() { … } } Method hitung() dapatdipanggiltanpaperlumelakukan instansiasi class Whatever Whatever.hitung();
Bagaimanajikasepertiini ? public class Whatever { public static Whatever getInstance() { … } } Method tersebutmengembalikan object bertipe Whatever Whatever object1 = Whatever.getInstance();
Kalauini ? public class Whatever { private Whatever() { } public static Whatever getInstance() { return new Whatever(); } } Tapimasihbisamembuatlebihdari 1 object !! Memanggil static method getInstance() merupakancara alternatifuntukinstansiasi
public class Singleton { private static Singleton oneObject; private Singleton() { } //… public static Whatever getInstance() { if(oneObject == null) oneObject= new Singleton(); return oneObject; } //…. }
Sudahcukup? TIDAK !! public static Whatever getInstance() { if(oneObject == null) oneObject= new Singleton(); return oneObject; } Berpotensi “gagal” jika program kita Multithreading !
Easy Fix ! public static synchronized Whatever getInstance() { if(oneObject == null) oneObject= new Singleton(); return oneObject; } Cara inimemilikikelemahankarena synchronizedmembuataplikasianda menjadilebihlambat !!
BeberapaPilihan (Multithread) • Tetapgunakan synchronized • Jika proses pembuatan object tidakmembutuhkansumberdaya yang besar (waktudan memory) • Buat instance sedinimungkin • Dijamin “aman” untuk multithread ! • Lakukanpengecekan “ganda” !
Buat instance sedinimungkin (Thread safe) public class Singleton { private static Singleton oneObject = new Singleton(); private Singleton() { } //… public static Whatever getInstance() { return oneObject; } //…. }
public class Singleton { private volatile static Singleton oneObject; private Singleton() { } //… public static Whatever getInstance() { if(oneObject == null) synchronized(Singleton.class) { if(oneObject == null) { oneObject = new Singleton(); } } } //…. } Pengecekanganda !
SEGERA Ada pertanyaan ?Konsultasikankomponenanda