Java Design Pattern – Singleton

Repost dari artikel saya di PC Mild 03/2011

Munculnya OOP (Object Oriented Programming) memberi banyak kemungkinan solusi untuk masalah-masalah pemrograman. Dalam masalah-masalah tersebut, ternyata ditemukan juga suatu pola penyelesaian yang bisa secara baku namun fleksibel digunakan dalam masalah lain yang serupa. Pola tersebut biasa disebut dengan “Design Pattern”.

Dalam ilmu Software Engineering, design pattern adalah suatu pola solusi umum yang digunakan pada masalah-masalah yang sering muncul pada desain software (sumber: Wikipedia.org). Tetapi design pattern bukanlah solusi akhir dari suatu masalah yang spesifik. Design pattern hanyalah pola bagaimana menyelesaikan suatu masalah yang bisa digunakan dalam berbagai situasi.

Design pattern pertama kali diperkenalkan oleh Erich Gamma, Richard Helm, Ralph Johnson, dan John Vlissides yang dikenal dengan “Gang of four”. Mereka mendapati di dalam kode program mereka, terdapat suatu pola yang sering muncul.

Sekali lagi, design pattern bukanlah suatu template, melainkan adalah solusi yang ditawarkan tanpa implementasi spesifik. Dengan kata lain, Anda dapat menggunakan design pattern yang sama dan mengimplementasikannya pada bahasa pemrograman apapun. Design pattern juga bukan framework. Tetapi kumpulan dari design pattern juga bisa diartikan sebagai suatu desain framework.

Salah satu pattern yang banyak digunakan dalam sebuah aplikasi adalah Singleton. Pattern ini digunakan ketika ada suatu resource yang hanya boleh ada satu instance eksklusif di dalamnya. Salah satu implementasinya sering digunakan pada kasus penggunaan resource database. Dalam aplikasi, cukup hanya ada 1 koneksi saja yang digunakan oleh berbagai object lainnya. Hal ini untuk mencegah pemborosan memory karena banyaknya instance yang sebenarnya tidak perlu.

UML Singleton Pattern

Contoh implementasi lain yang lebih sederhana adalah singleton untuk User yang sedang aktif dalam aplikasi tersebut, seperti langkah berikut ini.

  1. Buat sebuah class User dengan property sederhana saja. Class ini akan merepresentasikan sebuah user dari aplikasi.
    public class User {
      // *******variables area****** //
      private String username;
      private String password;
      // *****constructors area***** //
      public User(String username, String password) {
        this.username = username;
        this.password = password;
      }
      // ********methods area******* //
      public String getPassword() {
        return password;
      }
      public void setPassword(String password) {
        this.password = password;
      }
      public String getUsername() {
        return username;
      }
      public void setUsername(String username) {
        this.username = username;
      }
    }
  2. Sebaiknya singleton dibuat/diimplementasikan terpisah dari class aslinya, karena tujuan awal singleton adalah untuk merepresentasikan bahwa hanya ada satu instance saja dari sebuah class. Dengan demikian, class asli dapat diubah tanpa mengubah struktur singleton. Ini juga dilakukan untuk kemungkinan bahwa class User akan digunakan untuk proses lainnya seperti manipulasi record database dan sebagainya.
    public class CurrentUser {
      // *******variables area****** //
      private static User activeUser = null;

    Property activeUser dengan modifier private static akan menyimpan instance dari class User yang sedang aktif menggunakan aplikasi, namun tidak dapat diakses secara langsung dari class lainnya. Inisialisasi nilai awal adalah null.

      // *****constructors area***** //
      // untuk mencegah pembuatan object
      private CurrentUser() {}

    Constructor dibuat dengan modifier private agar tidak ada instance dari class CurrentUser yang dibuat dalam aplikasi. CurrentUser hanya sebagai singleton yang memanage user yang sedang aktif.

      // ********methods area******* //
      public static User user() {
        return activeUser;
      }

    Method user() digunakan untuk mendapatkan instance dari user yang sedang aktif.

      public static void login(String username, String password) {
        activeUser = new User(username, password);
      }
    
      public static void logout() {
        activeUser = null;
      }

    Method login dan logout dibuat juga dengan modifier static, karena aplikasi hanya membutuhkan satu method login dan logout saja.

      public static boolean isLoggedIn() {
        if(activeUser == null) {
          return false;
        } else {
          return true;
        }
      }
    }

    Method isLoggedIn digunakan untuk mendapatkan nilai apakah ada user yang sedang login atau tidak.

  3. Dengan memakai singleton ini, Anda tidak perlu membuat sebuah instance dari class User yang bersifat global dalam program dengan menulis baris “new User()”. Berikutnya adalah program untuk mencoba singleton yang telah dibuat. Manfaatkan method yang ada dalam singleton.
    public class SingletonTest {
      public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        if(CurrentUser.isLoggedIn()) {
          System.out.println("User "
              + CurrentUser.user().getUsername()
              + "telah login");
        } else {
          System.out.println("Belum ada user yang login");
          System.out.println("Masukkan username: ");
          String username = input.nextLine();
          System.out.println("Masukkan password: ");
          String password = input.nextLine();
          CurrentUser.login(username, password);
        }
        System.out.println("\nUser yang telah login:");
        System.out.println("Username: " + CurrentUser.user().getUsername());
        System.out.println("Password: " + CurrentUser.user().getPassword());
        System.out.println("\nUser akan logout...");
        CurrentUser.logout();
        System.out.println("User telah logout!");
        if(CurrentUser.isLoggedIn()) {
          System.out.println("Masih ada user yang login");
        } else {
          System.out.println("Tidak ada user yang login");
        }
      }
    }

    Output dari program adalah:

Download source code secara keseluruhanArtikel ini telah dipublikasikan di media cetak tabloid PC Mild edisi 03 tahun 2011 lalu.

5 Comments

Leave a Comment.