Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Factory 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 bir Document arayüzü oluşturun. Bu arayüz, içerik alan ve biçimlendirilmiş belge çıktısını döndüren tek bir render(string $content): string metoduna 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ür
    • HtmlDocument: render() metodu "<html>[content]</html>" döndürür
    • TextDocument: render() metodu "TXT: [content]" döndürür
  • DocumentFactory.php: Documents dosyasını dahil edin ve statik DocumentFactory metoduna sahip bir create(string $type): Document sınıfı oluşturun. Bu metot, türe göre uygun belge nesnesini döndürmek için match kullanmalıdır:
    • "pdf", yeni bir PdfDocument döndürür
    • "html", yeni bir HtmlDocument döndürür
    • "text", yeni bir TextDocument döndürür
    • Diğer tüm türler, InvalidArgumentException mesajı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"

?>
quiz iconKendini test et

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

Kendi başına pratik yap: Online PHP derleyicisi