Menu
Coddy logo textTech

Factory Kalıbı

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 72 / 91.

Factory Tasarım Deseni, nesne oluşturma işlemini ayrı bir sınıfa veya metoda devreden, nesne oluşturmaya yönelik (creational) bir tasarım desenidir. Kodunuzun her yerinde doğrudan new kullanmak yerine, nesneleri sizin için oluşturması için bir fabrikadan talepte bulunursunuz.

Bu desen, özellikle ortak bir arayüzü paylaşan birden fazla ilişkili sınıfınız olduğunda ve hangisinin örnekleneceğine belirli bir koşula göre karar vermek istediğinizde oldukça kullanışlıdır. Farklı kanallar üzerinden mesaj gönderebilen bir bildirim sistemini 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 (factory) olmadan, if ifadelerini ve new çağrılarını her yere dağıtırsınız. 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!');

Çıktı:

Email: Hello!

Temel avantaj, kodunuzun somut sınıflara değil, Notification arayüzüne bağlı olmasıdır. Daha sonra bir PushNotification sınıfı eklerseniz, sadece fabrikayı güncellersiniz. Fabrikayı kullanan tüm kodlar, herhangi bir değişiklik yapılmadan yeni türe otomatik olarak erişim sağlar.

challenge icon

Görev

Kolay

Fabrika Deseni'ni (Factory Pattern) kullanarak bir belge oluşturucu sistemi inşa edelim. Farklı belge türleri (PDF, HTML, Düz Metin) ortak bir arayüzü paylaşır ancak farklı çıktılar üretir — bu, nesne oluşturma işlemini bir fabrikada merkezileştirmek için mükemmel bir senaryodur.

Kodunuzu dört dosya halinde düzenleyeceksiniz:

  • Document.php — Tüm belge türlerinin uyması gereken sözleşmeyi tanımlayan bir Document arayüzü oluşturun. İçeriği 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 onu uygulayan (implement) üç sınıf oluşturun:
    • PdfDocumentrender() metodu "PDF: [content]" döndürür
    • HtmlDocumentrender() metodu "<html>[content]</html>" döndürür
    • TextDocumentrender() metodu "TXT: [content]" döndürür
  • DocumentFactory.php — Documents dosyasını dahil edin ve statik bir create(string $type): Document metoduna sahip bir DocumentFactory sınıfı oluşturun. Bu metot, türe bağlı olarak uygun belge nesnesini döndürmek için match kullanmalıdır:
    • "pdf" bir PdfDocument örneği döndürür
    • "html" bir HtmlDocument örneği döndürür
    • "text" bir TextDocument örneği döndürür
    • Diğer tüm türler, "Unknown document type: [type]" mesajıyla bir InvalidArgumentException 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çerikle birlikte render() metodunu çağırın ve sonucu yazdırın.

    Yeni bir satırda, bu desenin neden değerli olduğunu vurgulamak için "Factory benefit: Adding new types only requires updating the factory" yazdırın.

Fabrika Deseni kodunuzu esnek tutar — daha sonra bir MarkdownDocument eklemeniz gerektiğinde, mevcut tüm kodlar değişmeden çalışmaya devam ederken yalnızca fabrikayı güncellemeniz yeterli olacaktır.

Kopya kağıdı

Factory Deseni (Factory Pattern), nesne oluşturma işlemini kodunuzun her yerinde doğrudan new kullanmak yerine ayrı bir sınıfa veya yönteme devreder.

Bu desen, ortak bir arayüzü (interface) paylaşan birden fazla ilgili sınıfınız olduğunda ve bir koşula bağlı olarak hangisinin örnekleneceğine karar vermeniz gerektiğinde kullanışlıdır.

Bir bildirim sistemi ile örnek:

<?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";
    }
}

Factory, nesne oluşturma mantığını 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 avantajlar:

  • Kod somut sınıflara değil, arayüze bağlıdır
  • Yeni türler eklemek yalnızca factory'nin güncellenmesini gerektirir
  • Mevcut kod, herhangi bir değişiklik yapılmadan yeni türlere otomatik olarak erişim kazanır

Kendin dene

<?php
require_once 'DocumentFactory.php';

// Girişi oku
$type = trim(fgets(STDIN));
$content = trim(fgets(STDIN));

// YAPILACAK: Uygun belge türünü oluşturmak için DocumentFactory kullanın
// YAPILACAK: İçerikle birlikte render() metodunu çağırın ve sonucu yazdırın
// YAPILACAK: Yeni bir satıra "Factory benefit: Adding new types only requires updating the factory" yazdırın

?>
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