Ketika kita membuat sebuah aplikasi, biasanya ada object-object yang kita buat dan digunakan secara bersamaan (sharing) di seluruh aplikasi. Contoh yang paling mudah adalah koneksi ke database. Koneksi database biasanya kita inisaliasi diawal code kita dan di destroy ketika aplikasi kita tutup.
Kita gak mungkin mengcreate tiap object database maka akan boros resource. selama ini yang sering dilakukan adalah
- Menyimpannya object yang mau di share sebagai object global
- Menjadikan object tersebut sebagai parameter sebuah object
ada satu cara lagi yitu menggunakan pattern singleton contoh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | abstract class Singleton { static abstract public function getInstance(); static final protected function getClassInstance($klass, $args=NULL) { if(self::$instances === NULL) self::$instances = array(); if(!array_key_exists($klass, self::$instances)) self::$instances[$klass] = array(); $key = serialize($args); // jika gak ada di instann if(!array_key_exists($key, self::$instances[$klass])) { self::$instances[$klass][$key] = new $klass($args); } // Return instance $klass return self::$instances[$klass][$key]; } //menyimpan object yang telah diinstant berdasrkan ID static private $instances; } |
Kelas diatas merupakan kelas abstract yang berfungsi untuk membuat sebuah klas singleton
contoh penggunaan:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | final class Database extends Singleton { public $name; public $data; static public function getInstance($name = 'Default') { $args = array('name' => $name); return Singleton::getClassInstance(__CLASS__, $args); } protected function __construct($args) { $this->name = $args['name']; } } $a = Database:getInstance(); $a->data="ini dari Variabel A"; $b = Database:getInstance('Default'); $c = Database:getInstance('Default2'); $d = Database:getInstance('Default2'); $d->data="ini dari Variabel D"; var_dump($a); var_dump($b); var_dump($c); var_dump($d); |
Singleton ini konsep dasarnya seperti apa sih?
Satu instance object pada saat eksekusi.. jadi tidak perlu menggunakan variabel global atau reinstance