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.
Tantangan
MudahMari 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 antarmukaDocumentyang mendefinisikan kontrak yang harus diikuti semua jenis dokumen. Antarmuka ini harus memiliki satu methodrender(string $content): stringyang menerima konten dan mengembalikan keluaran dokumen yang sudah diformat.Documents.php: Sertakan antarmuka Document dan buat tiga class yang mengimplementasikannya:PdfDocument: Methodrender()-nya mengembalikan"PDF: [content]"HtmlDocument: Methodrender()-nya mengembalikan"<html>[content]</html>"TextDocument: Methodrender()-nya mengembalikan"TXT: [content]"
DocumentFactory.php: Sertakan file Documents dan buat classDocumentFactorydengan method statiscreate(string $type): Document. Method ini harus menggunakanmatchuntuk mengembalikan object dokumen yang sesuai berdasarkan jenisnya:"pdf"mengembalikan object baruPdfDocument"html"mengembalikan object baruHtmlDocument"text"mengembalikan object baruTextDocument- Jenis lainnya harus melempar
InvalidArgumentExceptiondengan 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"
?>Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses PembayaranLatihan sendiri: Compiler PHP online