Bismillahirrahmannirrahim.
Design Pattern Pertama: Singleton
Design pattern pertama yang saya pelajari adalah Singleton. Menurut saya, pola desain ini adalah salah satu yang paling sering digunakan dalam pengembangan perangkat lunak. Mengapa demikian? Karena salah satu implementasi paling umum dari Singleton adalah pada saat kita menulis kode untuk koneksi ke database.
Apa itu Singleton?
Singleton adalah pola desain yang memastikan bahwa sebuah kelas hanya memiliki satu instance saja selama siklus hidup aplikasi, dan menyediakan cara global untuk mengakses instance tersebut.
Sumber referensi: Refactoring.Guru - Singleton Pattern
Kenapa Harus Singleton?
Untuk memudahkan pemahaman, mari kita analogikan dengan printer di kantor. Tidak mungkin setiap karyawan diberi satu printer pribadi — cukup satu printer saja yang bisa digunakan bersama. Semua orang tetap bisa mencetak dokumen, tapi yang digunakan hanya satu printer secara bersama-sama.
Begitu juga dalam pemrograman. Misalnya saat membuat koneksi ke database, tanpa pola Singleton, kita bisa saja membuat koneksi baru setiap kali dibutuhkan. Padahal, dalam banyak kasus, satu koneksi yang dikelola dengan baik sudah cukup dan lebih efisien.
Dengan menerapkan Singleton, kita bisa memastikan hanya ada satu koneksi yang digunakan bersama oleh seluruh bagian aplikasi, sehingga lebih hemat sumber daya dan lebih stabil.
Mari kita lihat contoh kode berikut:
<?php
class KoneksiDatabase
{
private $servername = "localhost";
private $username = "username";
private $password = "password";
private $dbname = "database";
private $conn;
public function __construct()
{
$this->conn = new mysqli($this->servername, $this->username, $this->password, $this->dbname);
}
public function getConnection()
{
return $this->conn;
}
}
Sekilas, kode di atas tampak baik-baik saja. Namun perhatikan skenario berikut:
file a.php
<?php
$koneksi = new KoneksiDatabase();
file b.php
<?php
$koneksi = new KoneksiDatabase();
Jika aplikasi dijalankan dan kedua file (a.php
dan b.php
) dipanggil dalam satu proses, maka akan dibuat dua objek KoneksiDatabase
terpisah. Artinya, dua koneksi database aktif, yang mungkin tidak diperlukan dan justru membuang-buang resource.
Padahal kita bisa membuat satu objek saja, dan menggunakannya kembali di berbagai bagian aplikasi. Inilah tujuan utama dari penerapan pola Singleton.
Ciri-Ciri Umum Pola Singleton
Agar sebuah kelas memenuhi pola desain Singleton, biasanya memiliki ciri-ciri berikut:
-
Constructor bersifat
private
untuk mencegah kode di luar kelas untuk membuat objek baru secara langsung. -
Memiliki method
getInstance()
untuk mengakses satu-satunya instance dari kelas tersebut. -
Instance disimpan dalam variabel
static
Variabel ini berada di dalam kelas itu sendiri, dan digunakan untuk menyimpan serta mengontrol akses ke instance yang tunggal.
dari ciri ciri umum pola di atas kita bisa sesuaikan kelas KoneksiDatabase
sebelumnya agar sesuai dengan pola Singleton:
class KoneksiDatabase
{
private $servername = "localhost";
private $username = "username";
private $password = "password";
private $dbname = "database";
private $conn;
private static ?self $instance = null;
private function __construct()
{
$this->conn = new mysqli($this->servername, $this->username, $this->password, $this->dbname);
}
public static function getInstance()
{
if (self::$instance == null) {
self::$instance = new self();
}
return self::$instance;
}
public function getConnection()
{
return $this->conn;
}
}
Setelah kelas diubah sesuai pola Singleton, kita cukup memanggil instance-nya seperti ini:
$koneksi = KoneksiDatabase::getInstance();
Dan untuk mendapatkan koneksinya:
$conn = $koneksi->getConnection();
Dengan pendekatan ini, hanya akan ada satu objek koneksi database selama aplikasi berjalan. Efisien dan sesuai dengan prinsip resource management yang baik.