Singleton Pattern

Motivasi
Kadang ada keadaan di mana kita hanya boleh memiliki satu instan dari suatu kelas. Sebagai contoh, kita hanya boleh memiliki satu window manager (atau satu sistem file atau satu spooler printer) pada satu aplikasi. Biasanya singleton digunakan untuk managemen sumber daya internal maupun eksternal secara terpusat dan bisa diakses dimanapun.


Singleton merupkan salah satu design pattern yang paling sederhana. Singleton hanya melibatkan satu kelas yang bertanggung jawab untuk menginstansiasi dirinya sendiri dan pada saat yang bersamaan menyediakan akses secara global terhadap instan tersebut. Pada pattern singleton, instan bisa diakses dari manapun tanpa harus memanggil contructor dari kelas instan tersebut

Tujuan

• Memastikan bahwa satu kelas hanya bisa dibuat instannya sekali.
• Menyediakan akses secara global terhadap instan singleton tersebut.

Implementasi

Pada bahasa pemrograman Java, implementasi dari singleton adalah dengan membuat sebuah atribut static pada kelas "Singleton" , constructor dengan akses private, dan sebuah method static dengan akses public yang mengembalikan nilai yang mengacu pada atribut static.

Pattern Singleton mendefinisikan sebuah operasi yang bernama getInstance. Getinstance ini bertugas mengembalikan instan yang unik yang diakses oleh klien. GetInstance() adalah sebuah method yang bertanggung jawab untuk menciptakan sebuah instant dari kelas itu sendiri jika instan tersebut belum diciptakan. Jika sudah, method getinstant tinggal mengembalikan instan tersebut.

Sedangkan implementasi pada Delphi sedikit berbeda. Hal ini karena beberapa hal :
1. Pada Delphi versi lama, static field tidak didukung
2. AFAIK, Delphi tidak mengijinkan private constructor.

Untuk mengakali kekurangan tersebut, implementasi Singleton pada Delphi bisa dilakukan seperti di bawah ini :

unit Singletn;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs;

type

  TOSingleton = class(TObject)
  public
    constructor Create;
    destructor Destroy; override;
  end;

var

  Global_OSingleton: TOSingleton;

constructor TOSingleton.Create;
begin
  if Global_OSingleton <> nil then
    {NB could show a message or raise a different exception here}
    Abort
  else
    Global_OSingleton := Self;
end;

destructor TOSingleton.Destroy;
begin
  if Global_OSingleton = Self then
    Global_OSingleton := nil;
  
  inherited Destroy;
end;

procedure FreeGlobalObjects; far;
begin  
  if Global_OSingleton <> nil then
    Global_OSingleton.Free;
end;

Coba anda perhatikan baris kode pada contructor. Disitu tertulis, jika variable
Global_OSingleton <> nil
maka method Abort akan dieksekusi, atau bisa juga diganti dengan melemparkan eksepsi. Jika

Global_OSingleton  = nil
maka akan dicreate sebuah instan dari kelas TOSingleton.

Penerapan Contoh

Sesuai dengan definisi, pattern singleton digunakan ketika dibutuhkan hanya ada satu instan dari suatu kelas, dan ketika instan tersebut harus bisa diakses dari manapun. Berikut ini contoh real dimana pattern singleton diterapkan :

Contoh 1 – Kelas Log

Pattern singleton digunakan untuk kelas log. Kelas ini biasanya diimplementasikan sebagai sebuah singleton, dan menyediakan akses secara global dari manapun tanpa harus mengistansiasi kelas tersebut tiap kali melakukan operasi log.

Contoh 2 –Kelas Konfigurasi

Pattern singleton digunakan untuk kelas yang mengatur kofigurasi sebuah aplikasi. Dengan mengimplementasi kelas konfigurasi sebagai singleton, bukan hanya menyediakan akses global , tapi juga menjadikan instan dari kelas konfigurasi tersebut sebagai cache objek. Ketika kelas konfigurasi dinstansiasi, singleton akan menyimpan data konfigurasi tersebut sesuai struktur kelas tersebut. Jika data konfigurasi diambil dari database atau file, singleton memungkinkan kita bisa mengakses data tersebut tanpa melakukan pengambilan ulang dari database atau file tiap kali kita membutuhkan.

Contoh3 - Dipakai Untuk Mengakses sumberdaya yang dipakai bersama

Singleton bisa digunakan pada aplikasi yang membutuhkan akses ke port serial. Misal, ada banyak kelas dalam aplikasi, berada pada lingkungan multithreading , yang harus mengerjakan sesuatu pada port serial.Pada kasus ini singleton dengan method harus digunakan untuk mengatur semua operasi pada port serial tersebut.

Demikianlah sekilas tentang pattern singleton. Semoga bermanfaat dan tetap semangat !



0 comments:

Post a Comment