Singleton Pattern

Post on 21-Jan-2016

47 views 0 download

description

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 - PowerPoint PPT Presentation

Transcript of Singleton Pattern

Singleton Pattern

1 oneuno

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

Misal : hanya 1 lisensi koneksi

Else ?• Application Setting (Preferences)

Beberapa bagian program yang berbeda akan membaca dan menulis setting

More ?• Logging activities

Beberapa bagian program perlu menulis ke file log yang sama

Singleton

• Memastikan suatu class hanya dapat “menghasilkan” satu object saja

• Konsepnya mirip global variable (dengan perbedaan)

• Pada Singleton, object hanya dibuat saat dibutuhkan, sedangkan Global Variable dibuat saat awal program dijalankan

public class Whatever {…

}

Bagaimana cara membuat object dari class Whatever ?

Whatever object1 = new Whatever();

Bisa membuat lebih dari 1 object ?

Whatever object1 = new Whatever();Whatever object2 = new Whatever();…Whatever object100 = new Whatever();

Public ! Bagaimana jika default ?

class Whatever {…

}Hanya dapat diakses dari package yang sama !

Tetap bisa dibuat lebih dari 1 object dari class Whatever

Whatever object1 = new Whatever();Whatever object2 = new Whatever();…Whatever object100 = new Whatever();

Object membutuhkan memory, semakin banyak object ?

Tahukah anda, kita dapat melakukan ini

public class Whatever {private Whatever() {}

}

Private Constructor !

Apa konsekuensinya ? Hubungannya dengan Singleton ?

Masih ingat konsep static method ?

public class Whatever {public static void hitung() {

…}

}

Whatever.hitung();

Method hitung() dapat dipanggil tanpa perlu melakukan instansiasi class Whatever

Bagaimana jika seperti ini ?

public class Whatever {public static Whatever getInstance() {

…}

}

Method tersebut mengembalikan object bertipe Whatever

Whatever object1 = Whatever.getInstance();

Kalau ini ?

public class Whatever {private Whatever() { }

public static Whatever getInstance() {return new Whatever();

}}

Memanggil static method getInstance() merupakan caraalternatif untuk instansiasi

Tapi masih bisa membuat lebih dari 1 object !!

public class Singleton {private static Singleton oneObject;private Singleton() { }//…public static Whatever getInstance() {

if(oneObject == null)oneObject = new Singleton();

return oneObject;}//….

}

Sudah cukup? TIDAK !!

public static Whatever getInstance() {if(oneObject == null)

oneObject = new Singleton();return oneObject;

}

Berpotensi “gagal” jika program kitaMultithreading !

Easy Fix !

public static synchronized Whatever getInstance() {if(oneObject == null)

oneObject = new Singleton();return oneObject;

}

Cara ini memiliki kelemahan karena synchronized membuat aplikasi anda menjadi lebih lambat !!

Beberapa Pilihan (Multithread)

• Tetap gunakan synchronized– Jika proses pembuatan object tidak membutuhkan

sumber daya yang besar (waktu dan memory)

• Buat instance sedini mungkin– Dijamin “aman” untuk multithread !

• Lakukan pengecekan “ganda” !

Buat instance sedini mungkin (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();}

}}//….

}Pengecekan ganda !

Class Diagram Singleton

ADA PERTANYAAN ?

KONSULTASIKAN KOMPONEN ANDA

SEGERA

NEXT : COMMAND PATTERN