Menu
CoddyTech

Pola Factory

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 72 dari 91.

Factory Pattern adalah pola desain kreasi yang mendelegasikan pembuatan object ke class atau method terpisah. Alih-alih menggunakan new secara langsung di seluruh kodemu, kamu meminta factory untuk membuat object untukmu.

Pola ini sangat berguna saat kamu memiliki beberapa class terkait yang menggunakan antarmuka umum, dan kamu ingin menentukan class mana yang akan dibuat sebagai instance berdasarkan kondisi tertentu. Pertimbangkan sistem notifikasi yang dapat mengirim pesan melalui berbagai saluran:

<?php
interface Notification {
    public function send(string $message): string;
}

class EmailNotification implements Notification {
    public function send(string $message): string {
        return "Email: $message";
    }
}

class SmsNotification implements Notification {
    public function send(string $message): string {
        return "SMS: $message";
    }
}

Tanpa factory, kamu akan menyebarkan pernyataan if dan pemanggilan new ke mana-mana. Factory memusatkan logika ini:

<?php
class NotificationFactory {
    public static function create(string $type): Notification {
        return match($type) {
            'email' => new EmailNotification(),
            'sms' => new SmsNotification(),
            default => throw new InvalidArgumentException("Unknown type: $type")
        };
    }
}

$notification = NotificationFactory::create('email');
echo $notification->send('Hello!');

Output:

Email: Hello!

Manfaat utamanya adalah kodemu bergantung pada antarmuka Notification, bukan pada class konkret. Jika nanti kamu menambahkan class PushNotification, kamu hanya perlu memperbarui factory. Semua kode yang menggunakan factory akan otomatis mendapatkan akses ke tipe baru tanpa perubahan.

challenge icon

Tantangan

Mudah

Mari kita membangun sistem pembuat dokumen menggunakan Pola Factory. Berbagai jenis dokumen (PDF, HTML, teks biasa) memiliki antarmuka yang sama, tetapi menghasilkan keluaran yang berbeda: situasi yang sempurna untuk memusatkan pembuatan object di sebuah factory.

Kamu akan mengatur kodemu dalam empat file:

  • Document.php: Buat antarmuka Document yang mendefinisikan kontrak yang harus diikuti semua jenis dokumen. Antarmuka ini harus memiliki satu method render(string $content): string yang menerima konten dan mengembalikan keluaran dokumen yang sudah diformat.
  • Documents.php: Sertakan antarmuka Document dan buat tiga class yang mengimplementasikannya:
    • PdfDocument: Method render()-nya mengembalikan "PDF: [content]"
    • HtmlDocument: Method render()-nya mengembalikan "<html>[content]</html>"
    • TextDocument: Method render()-nya mengembalikan "TXT: [content]"
  • DocumentFactory.php: Sertakan file Documents dan buat class DocumentFactory dengan method statis create(string $type): Document. Method ini harus menggunakan match untuk mengembalikan object dokumen yang sesuai berdasarkan jenisnya:
    • "pdf" mengembalikan object baru PdfDocument
    • "html" mengembalikan object baru HtmlDocument
    • "text" mengembalikan object baru TextDocument
    • Jenis lainnya harus melempar InvalidArgumentException dengan pesan "Unknown document type: [type]"
  • main.php: Sertakan file DocumentFactory. Kamu akan menerima dua input: jenis dokumen dan konten yang akan dirender.

    Gunakan factory untuk membuat jenis dokumen yang sesuai, lalu panggil method render()-nya dengan konten tersebut dan cetak hasilnya.

    Pada baris baru, cetak "Factory benefit: Adding new types only requires updating the factory" untuk menunjukkan manfaat pola ini.

Pola Factory membuat kodemu tetap fleksibel. Saat kamu perlu menambahkan MarkdownDocument nanti, kamu hanya perlu memperbarui factory, sementara semua kode yang sudah ada tetap berfungsi tanpa perubahan.

Coba sendiri

<?php
require_once 'DocumentFactory.php';

// Baca input
$type = trim(fgets(STDIN));
$content = trim(fgets(STDIN));

// TODO: Gunakan DocumentFactory untuk membuat tipe dokumen yang sesuai
// TODO: Panggil method render() dengan konten tersebut dan cetak hasilnya
// TODO: Pada baris baru, cetak "Factory benefit: Adding new types only requires updating the factory"

?>
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online