CodeBlanks Logo Icon CodeBlanks

Factory deseni

PHP kursu · İleri seviye · Ders 82/92

Nesne oluşturmayı merkezi bir factory method'a taşımayı öğrenirsin.

Factory deseni ne yapar?

Factory deseni nesne oluşturmayı merkezi bir yere taşır. İstemci sınıf adlarını doğrudan new ile yazmak yerine bir createProduct yöntemini çağırır ve hangi somut sınıfın üretildiğini bilmek zorunda kalmaz.

Bütün ürünler ortak bir Product arayüzünü uygular; somut ürünler ConcreteProductA ve ConcreteProductB gibi adlarla gelir. Böylece istemci kodu değişmeden yeni ürün türleri eklenebilir.

Basit Factory: switch ile sınıf seçimi

Basit Factory'de tek bir sınıf, bir switch veya match ifadesiyle hangi somut sınıfın üretileceğini seçer. Çağrı Factory::createProduct('a') gibi bir dizge anahtarıyla yapılır; sonuç bir Product örneğidir.

PHP'nin match ifadesi hem kısa hem de bir değer döndürür; bu yüzden Factory için uygundur. Bilinmeyen anahtar için default kolu hata fırlatarak yanlış çağrıları yakalar.

Uygulama Factory ile ürün oluştur ve adını yazdır

Bir Product arayüzü yaz (name(): string yöntemi olsun). ConcreteProductA ve ConcreteProductB sınıfları bu arayüzü uygulasın; A 'Ürün A', B 'Ürün B' döndürsün. Factory::createProduct('a') çağır ve ürünün adını yazdır.

Örnek çözümü göster
string; } yaz. ConcreteProductA için 'Ürün A', ConcreteProductB için 'Ürün B' döndür. Factory::createProduct('a') ile örneği al ve ->name() yazdır.
Örnek çözüm:
<?php
interface Product {
    public function name(): string;
}
class ConcreteProductA implements Product {
    public function name(): string { return 'Ürün A'; }
}
class ConcreteProductB implements Product {
    public function name(): string { return 'Ürün B'; }
}
class Factory {
    public static function createProduct(string $type): Product {
        return match ($type) {
            'a' => new ConcreteProductA(),
            'b' => new ConcreteProductB(),
            default => throw new \InvalidArgumentException('bilinmiyor'),
        };
    }
}
$p = Factory::createProduct('a');
echo $p->name();

Kendini test et

  1. Üreten yöntemin adı

    <?php
    class Factory {
        public static function ____(string $type): Product {
            return match ($type) {
                'a' => new ConcreteProductA(),
                'b' => new ConcreteProductB(),
            };
        }
    }
    
    Cevabı göster
    <?php
    class Factory {
        public static function createProduct(string $type): Product {
            return match ($type) {
                'a' => new ConcreteProductA(),
                'b' => new ConcreteProductB(),
            };
        }
    }
    
  2. Factory::createProduct('a') ne türünde değer döndürür?

    • Dizge (string)
    • Sınıf adı yazan dizi
    • Product örneği (nesne)
    • Tam sayı (integer)
    Cevabı göster

    Product örneği (nesne) — Doğru. createProduct bir Product örneği (nesne) döndürür, sınıf adı değil.

  3. Factory kavramlarını eşleştir

    Product
    ortak arayüz
    ConcreteProductA
    somut ürün A
    ConcreteProductB
    somut ürün B
    createProduct
    örnek oluşturur

İleri seviye bölümündeki tüm dersler