Hari 25: Design Pattern — Singleton & Factory
60 min
Last updated 09 Apr 2026
Singleton Pattern
class Database {
private static ?Database $instance = null;
private int $queryCount = 0;
private function __construct() {} // private constructor
public static function getInstance(): static {
if (static::$instance === null) {
static::$instance = new static();
}
return static::$instance;
}
public function query(string $sql): string {
$this->queryCount++;
return "Query #{$this->queryCount}: $sql";
}
}
$db1 = Database::getInstance();
$db2 = Database::getInstance();
echo ($db1 === $db2 ? "Same instance" : "Different") . "\n";
echo $db1->query("SELECT * FROM users") . "\n";
echo $db2->query("SELECT * FROM posts") . "\n";
Factory Pattern
interface Notifikasi {
public function kirim(string $pesan): void;
}
class EmailNotifikasi implements Notifikasi {
public function kirim(string $pesan): void {
echo "[EMAIL] $pesan\n";
}
}
class SMSNotifikasi implements Notifikasi {
public function kirim(string $pesan): void {
echo "[SMS] $pesan\n";
}
}
class NotifikasiFactory {
public static function buat(string $tipe): Notifikasi {
return match($tipe) {
"email" => new EmailNotifikasi(),
"sms" => new SMSNotifikasi(),
default => throw new \InvalidArgumentException("Tipe tidak dikenal: $tipe"),
};
}
}
$notif = NotifikasiFactory::buat("email");
$notif->kirim("Selamat datang!");
💡
Notice: Factory Pattern memisahkan kreasi objek dari penggunaan. Cocok saat perlu membuat objek berbeda berdasarkan kondisi.
Assignment
Buat Factory untuk Shape: Factory::buat("lingkaran", 7) buat Lingkaran, Factory::buat("persegi", 5) buat Persegi. Keduanya punya method luas(). Tampilkan luas keduanya.
Expected output:
153.94
25.00
PHP
index.php
Solution
Output