Kita sudah melihat kelas Singleton pada postingan sebelumnya. Tapi, kelas Singleton tersebut masih berupa template. Kita belum melihat bagaimana konsep Singleton digunakan untuk sesuatu yang bermanfaat.
Dalam prakteknya, Singleton pattern digunakan ketika kita membutuhkan hanya satu objek, tidak boleh lebih. Sebagai contoh, print spooler. Di dalam suatu sistem komputer, kita harus memastikan hanya ada satu print spooler. Bila lebih dari satu, dapat menyebabkan printer tidak bekerja dengan baik. Bisa-bisa, dokumen yang berbeda dari print spooler yang berbeda tercetak pada halaman yang sama. Kita bisa saja mempunyai lebih dari satu printer, tetapi print spooler tetap satu.
Contoh yang lain adalah registry. Bila terdapat lebih dari satu registry, bisa menyebabkan ketidakkonsistenan data-data di registry. Dan kalau tidak konsisten, system bisa crash. Contoh yang lain lagi adalah kotak dialog Find pada microsoft word. Ketika kita mengetikkan shortcut ctrl+f, muncul dialog Find. Kita ketikkan ctrl+f lagi, ternyata dialog Find tidak bertambah. Masih terdapat satu dialog Find di word. Kita tidak bisa lagi membuat instance dari frame dialog Find. Singleton pattern digunakan di sini. Dan.., masih banyak lagi contoh lainnya.
… Sekarang, andaikan kita mempunyai program untuk me-maintain buku alamat. Tetapi kita mempunyai masalah. Program tersebut berjalan terlalu lambat. Di dalam program kita ada objek BukuAlamat. Karena menampung jumlah data yang amat banyak, objek BukuAlamat tersebut berukuran cukup besar. Performa program kurang bagus karena kita terlalu banyak menginstance-kan objek BukuAlamat di dalam kode program sehingga membutuhkan memori yang besar.
Kali ini, kita coba memecahkan masalah performa dengan menerapkan policy BukuAlamat hanya boleh di-instance sekali sehingga hanya terdapat satu buku alamat aktif saja. Dengan kata lain, kita menerapkan Singleton Pattern. Bila kita ingin membuat buku alamat yang lain, instance BukuAlamat harus di-null-kan terlebih dahulu. Ada kalanya kita lupa dengan policy ini, dengan membuat instance baru BukuAlamat meskipun sudah ada instance sebelumnya. Kalau begini, Singleton pattern akan mencegahnya.
Sekarang, kita coba wrap BukuAlamat dengan template kelas Singleton yang telah kita buat sebelumnya. Kira-kira akan menjadi begini (BukuAlamat.java):
import java.util.*;
public class BukuAlamat {
//instance Singleton
private static BukuAlamat myInstance;
//atribut buku alamat
private ArrayList<String> buku;
private String namaBukuAlamat;
private int jumlahEntry;
// private constructor
private BukuAlamat(String nama) {
buku = new ArrayList<String>();
namaBukuAlamat = nama;
jumlahEntry = 0;
}
public static BukuAlamat getInstance(String nama) {
if (myInstance == null) {
myInstance = new BukuAlamat(nama);
}
return myInstance;
}
public String getNamaBukuAlamat() {
return namaBukuAlamat;
}
// Method buku alamat
public void addEntry(String entry) {
if (entry != null) {
buku.add(entry);
jumlahEntry++;
}
}
}
Kelas testernya seperti ini (SingletonTester.java):
public class SingletonTester {
public static void main(String args[]) {
BukuAlamat bukuAlamat = BukuAlamat.getInstance("Teman SD");
System.out.println("Buku Alamat: " + bukuAlamat.getNamaBukuAlamat());
// Buat instance baru BukuAlamat
BukuAlamat bukuAlamatBaru = BukuAlamat.getInstance("Teman SMP");
System.out.println("Buku Alamat: " + bukuAlamatBaru.getNamaBukuAlamat());
}
}
Kita lihat apakah kelas kita ini mempan menerapkan Singleton pattern…

Dilihat dari output di atas, ternyata kita tidak bisa membuat instance baru dari BukuAlamat. Kita ingin membuat BukuAlamat “Teman SMP“, tetapi karena sudah ada BukuAlamat “Teman SD“, kita gagal membuatnya.
Ok, kali ini kita mendapatkan hasil seperti yang kita inginkan. Jadi, Singleton pattern bekerja.
And one more thing, ilustrasi ini merupakan salah satu contoh bagaimana Singleton pattern digunakan untuk mencegah penggunaan system resources yang terlalu besar.