ActionScript 3.0: Singleton Pattern

Sekedar tulisan singkat tentang Singleton Pattern.

singleton


Apa itu Singleton? Singleton adalah object yang hanya bisa diinstatiate satu kali saja.

Apa fungsinya? Fungsinya yaitu untuk membuat object yang diinstatiate oleh banyak class, namun tetap bertindak sebagai satu object saja. Sehingga data2x yang ada di object tersebut tetap sama dan memungkinkan akses secara global terhadap data yang disimpan di object tersebut.

Selain itu dengan singleton ini kita dapat menghindari penggunaan global variables (public static var) jika memerlukan akses secara global thd suatu data.

Contohnya? Berhubung saya gak pernah pegang yang lain selain game programming, maka contohnya pun juga ga jauh2x dari game programming, misalnya:

1. Score system dalam game, untuk sebuah game yang tidak terlalu kompleks, kita hanya memerlukan satu object saja yang dapat menyimpan info2x mengenai score, stats, achievements, dll seorang player dalam suatu game. Dan data itu bisa diakses dari semua class, misalnya kita membagi tiap2x state screen (menu screen, game over screen, game play screen, dll) kedalam class2x terpisah, dan kita akan menampilkan info2x mengenai player tsb ke semua screen.

2. Sound manager, jelas sekali kita hanya perlu satu sound manager object untuk keseluruhan game kita. Karena dengan begitu kita memiliki kontrol terpusat untuk mengendalikan semua suara dan music di game kita.

3. dll

Lebih komplitnya ttg Singleton ini bisa cek di wikipedia


Code

Nah untuk implementasinya di Actionscript3.0 sendiri ada satu hal yang perlu diperhatikan yaitu bahwa AS3.0 tidak support private class yang mana merupakan poin penting dari singleton itu sendiri. Namun masalah ini bisa diakali dengan membuat sebuah internal class yang berfungsi layaknya private class pada class Singleton itu.

Daripada bingung mending langsung cek kodenya:
package singleton 
{
 public class Singleton 
 {
  private static var instance:Singleton;
  
  public function Singleton(pvt:PrivateClass) 
  {
   
  } 
  
  public static function getInstance():Singleton
  {
   if (Singleton.instance == null)
   {
    Singleton.instance = new Singleton(new PrivateClass());
    
    trace("singleton instantiated");
   }
   else
   {
    trace("singleton already instatiated");
   }
   
   return instance;
  }
 }
}

class PrivateClass
{
 public function PrivateClass()
 {
  trace("private class is up");
 }
}



Langsung liat ke baris 30, dibuat class lagi selain class Singleton itu sendiri, yaitu class PrivateClass, dan tanpa mengidentifikasi access modifiernya, yang berarti class tersebut bersifat internal., hanya bisa diakses oleh class lain dalam satu package.

Fungsi PrivateClass ini sebenarnya hanya sebagai semacam kunci sehingga tidak memungkinkan object Singleton diinstatiate dengan cara biasa:
var mySingleton:Singleton=new Singleton(new PrivateClass);

karena memang PrivateClass tidak dapat diakses diluar package singleton.

Oleh karena itu untuk menginstatiate nya harus menggunakan method getInstance():
var mySingleton:Singleton=Singleton.getInstace();

Yang perlu digarisbawahi adalah method getInstace() ini bersifat public static sehingga diakses via class bukan via instance.

Dan karena bersifat static maka mau tidak mau instance yang dibuat harus juga bersifat static agar bisa diakses oleh method itu sendiri. Bisa dilihat pada variable instance pd line 5.

Untuk fungsionalitas method getInstace() itu sendiri harusnya sudah cukup jelas, yaitu mengecek apakah variable instace masih null atau tidak, jika ya maka buat dulu object barunya, jika tidak maka cukup kita return saja instance itu.

Kurang lebih seperti itu mengenai Singleton Pattern. Semoga tidak tambah bingung. Dan kalau masih bingung mungkin bisa cari2x di google sendiri. Open-mouthed smile

Freelance 2D game artist, occassional game developers, lazy blogger, and professional procrasctinator

1 comment:

  1. In the Singleton() constructor, you should check whether the supplied private class is null...

    if (pvt == null)
    {
    throw new Error("Class cannot be constructed - must use getInstance");
    }

    ReplyDelete