Factory Deseni
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 72 / 91.
Factory Pattern, nesne oluşturma işlemini ayrı bir sınıfa veya metoda devreden, nesne oluşturmaya yönelik bir tasarım desenidir. Kodunuzun her yerinde doğrudan new kullanmak yerine, nesneleri sizin için oluşturması amacıyla bir factory'den istersiniz.
Bu kalıp, ortak bir interface paylaşan birden fazla ilişkili sınıfa sahip olduğunuzda ve bir koşula göre hangisini oluşturacağınıza karar vermek istediğinizde özellikle kullanışlıdır. Farklı kanallar aracılığıyla message gönderebilen bir notification sistemi düşünün:
<?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";
}
}
Bir fabrika olmadan, her yere if ifadeleri ve new çağrıları serpiştirirdiniz. Fabrika bu mantığı merkezileştirir:
<?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!Temel fayda, kodunuzun somut sınıflara değil, Notification arayüzüne bağlı olmasıdır. Daha sonra bir PushNotification sınıfı eklerseniz yalnızca fabrikayı güncellersiniz. Fabrikayı kullanan tüm kodlar, herhangi bir değişiklik yapılmasına gerek kalmadan yeni türe otomatik olarak erişim kazanır.
Görev
KolayFactory Pattern kullanarak bir belge oluşturma sistemi geliştirelim. Farklı belge türleri (PDF, HTML, Düz Metin) ortak bir arayüzü paylaşır, ancak farklı çıktılar üretir: nesne oluşturmayı bir fabrikada merkezileştirmek için mükemmel bir senaryo.
Kodunuzu dört dosya boyunca düzenleyeceksiniz:
Document.php: Tüm belge türlerinin uyması gereken sözleşmeyi tanımlayan birDocumentarayüzü oluşturun. Bu arayüz, içerik alan ve biçimlendirilmiş belge çıktısını döndüren tek birrender(string $content): stringmetoduna sahip olmalıdır.Documents.php: Document arayüzünü dahil edin ve bu arayüzü uygulayan üç sınıf oluşturun:PdfDocument:render()metodu"PDF: [content]"döndürürHtmlDocument:render()metodu"<html>[content]</html>"döndürürTextDocument:render()metodu"TXT: [content]"döndürür
DocumentFactory.php: Documents dosyasını dahil edin ve statikDocumentFactorymetoduna sahip bircreate(string $type): Documentsınıfı oluşturun. Bu metot, türe göre uygun belge nesnesini döndürmek içinmatchkullanmalıdır:"pdf", yeni birPdfDocumentdöndürür"html", yeni birHtmlDocumentdöndürür"text", yeni birTextDocumentdöndürür- Diğer tüm türler,
InvalidArgumentExceptionmesajıyla bir"Unknown document type: [type]"fırlatmalıdır
main.php: DocumentFactory dosyasını dahil edin. İki girdi alacaksınız: bir belge türü ve işlenecek içerik.Uygun belge türünü oluşturmak için fabrikayı kullanın, ardından içeriği kullanarak
render()metodunu çağırın ve sonucu yazdırın.Bu kalıbın neden değerli olduğunu vurgulamak için yeni bir satırda
"Factory benefit: Adding new types only requires updating the factory"yazdırın.
Factory Pattern kodunuzu esnek tutar; daha sonra bir MarkdownDocument eklemeniz gerektiğinde, mevcut tüm kod değişmeden çalışmaya devam ederken yalnızca fabrikayı güncellersiniz.
Kendin dene
<?php
require_once 'DocumentFactory.php';
// Girişi oku
$type = trim(fgets(STDIN));
$content = trim(fgets(STDIN));
// TODO: Uygun belge türünü oluşturmak için DocumentFactory kullan
// TODO: content ile render() metodunu çağır ve sonucu yazdır
// TODO: On a new line, print "Factory benefit: Adding new types only requires updating the factory"
?>Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi