Yazılım dünyasında nesne oluşturmak sıradan bir iş gibi görünse de, doğru yerde, doğru şekilde nesne üretmek birçok projede kritik öneme sahiptir. İşte bu noktada Factory Pattern (Fabrika Deseni) devreye girer.
Bu yazıda, Factory Pattern nedir, ne işe yarar, hangi projelerde kullanılır ve PHP ile nasıl uygulanır adım adım öğreniyoruz.
Factory Pattern Nedir? (Basit ama Detaylı Anlatım)
Factory Pattern, nesne oluşturma (instance creation) işlemini sınıfın dışına çıkartarak, nesne üretme işini özel bir “fabrika” sınıfa devreden bir tasarım desenidir.
Neden ihtiyaç duyulur?
Kod içinde sürekli olarak new
kullanarak farklı sınıflardan nesneler oluşturmak, kod tekrarına ve sıkı bağımlılığa (tight coupling) yol açar.
Factory deseni bu problemi çözer:
-
Nesne üretimi tek bir noktadan yapılır.
-
Yeni sınıflar eklense bile, kodun geri kalanı etkilenmez.
-
Değişiklikler merkezi olarak yönetilir.
Basit bir benzetme:
Bir pizzacıda sipariş geldiğinde her pizzayı mutfaktaki çalışan kendisi üretirse kaos olur. Bunun yerine siparişi alan kişi pizzayı mutfaktaki üretim bölümüne (fabrikaya) iletir. Üretim bölümü pizzayı hazırlar ve sunar.
Factory Pattern Ne İçin Kullanılır?
-
Sınıflar arası bağımlılığı azaltmak için
-
Karmaşık nesne üretim mantığını tek yerde toplamak için
-
Kodun genişletilebilirliğini artırmak için
Factory Pattern Kullanılan Proje Türleri
Proje Türü | Kullanım Örneği |
---|---|
🛒 E-Ticaret Siteleri | Farklı kargo firmalarına göre sınıf üretimi |
📄 Belge Yönetimi | PDF, Word, Excel gibi farklı formatlar |
💳 Ödeme Sistemleri | Kredi kartı, havale, PayPal gibi yöntemler |
🔌 API Bağlantıları | Farklı servisler için ayrı client nesneleri |
PHP ile Factory Pattern Örneği
Senaryo: Kullanıcı farklı araç türleri oluşturmak istiyor (Araba, Motosiklet). Her araç kendi çalıştırma metoduna sahip. Factory deseniyle bu nesneleri dinamik oluşturacağız.
1.)
Bu interface
(arayüz), tüm araç sınıflarının (örneğin Car
, Motorcycle
) ortak bir davranışı (burada: start()
) zorunlu olarak içermesini sağlar.
Her araç start()
metodunu mutlaka yazmak zorundadır. Aksi halde hata alırsın.
<?php
//Vehicle.php
interface Vehicle {
public function start();
}
<?php
//Car.php
require_once 'Vehicle.php';
class Car implements Vehicle {
public function start() {
echo "Araba çalıştırıldı 🚗\n";
}
}
<?php
//Motorcycle.php
require_once 'Vehicle.php';
class Motorcycle implements Vehicle {
public function start() {
echo "Motosiklet çalıştırıldı 🏍️\n";
}
}
<?php
//VehicleFactory.php
require_once 'Car.php';
require_once 'Motorcycle.php';
class VehicleFactory {
public static function createVehicle($type) {
switch (strtolower($type)) {
case 'car':
return new Car();
case 'motorcycle':
return new Motorcycle();
default:
throw new Exception("Geçersiz araç türü.");
}
}
}
<?php
//index.php
require_once 'VehicleFactory.php';
try {
$vehicle1 = VehicleFactory::createVehicle('car');
$vehicle1->start(); // Araba çalıştırıldı
$vehicle2 = VehicleFactory::createVehicle('motorcycle');
$vehicle2->start(); // Motosiklet çalıştırıldı
} catch (Exception $e) {
echo $e->getMessage();
}
Avantajları
✅ Kod tekrarını azaltır
✅ Genişletilebilir bir yapı sunar
✅ Karmaşık nesne oluşturma işlemleri kontrol altına alınır
✅ Test yazmayı kolaylaştırır
Neden Factory Kullanmalıyız?
Factory Pattern sayesinde yazdığın kod daha esnek, test edilebilir ve sürdürülebilir hale gelir. Özellikle birden fazla türde nesne üretimi yapılan uygulamalarda bu desenin kullanılması profesyonel bir yaklaşımdır.