Learn
← Previous Next →

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