28 Eylül 2009Php Factory Design Pattern
Factory design pattern bize belirtilen sınıfları new operatörüyle başlatıp döndürür. Normal bir sınıf başlatmaktan pek bir farkı olmasada burdaki amaç bir nesne arayüzü yaratarak sınıflara erişimi bu arayüz üzerinden gerçekleştirmektir.
Örnek olarak bir factory pattern sınıfı yazalım. Bu sınıf bize belirtilen nesne adına göre uygun bir dizinden ( class ) ilgili classı bulup başlatıp döndürdürsün.
< ?php class factory { const class_dir = 'classes'; public static function load($class) { try { if (file_exists(self::class_dir.'/'.$class.'.class.php')) { include_once(self::class_dir.'/'.$class.'.class.php'); return new $class(); } else { throw new Exception('Class Bulunamadı.'); } } catch (Exception $e) { echo $e; } } } ?>
Yukarıda tanımladığımız factory class bize belirtilen classın class_dir dizininde olup olmadığına bakarak eğer varsa bize başlatarak dönecektir eğer yok ise catch bloğu çalışarak class bulunamadı hatasını verecektir. Ayrıca yukarıdaki sınıfa göre sınıflar class_dir dizininde ve dosya adları da abc.class.php şeklinde olduğu varsayılmıştır.
Şimdi gelelim iki tane sınıf yazalım. Birtanesi girilen ismi yazsın diğer ise sadece soyadını yazsın. Örnekleri basit tutuyorum ki anlaşılabilsin diye sonra demeyin isim ve soyisimden başka bişey bilmiyor musun be adam sen diye
< ?php class name { public function getName($name) { echo $name; } } ?>
Şimdide soyisim sınıfımızı tanımlayalım
< ?php class surname { public function getSurname($surname) { echo $surname; } } ?>
Bu classları class_dir dizinine name.class.php ve surname.class.php olarak kaydettiğinizi varsayıyorum ve factory sınıfımızın kullanımına geçiyorum
< ?php include_once('class_dir/factory.class.php'); $isim = factory::load('name'); $isim->getName('yusuf '); $surname = factory::load('surname'); $surname->getSurname('koç'); ?>
Yukarıda öncelikle factory sınıfımızı sayfamıza dahil ediyoruz ve ardından artık bize hangi sınıf gerekiyorsa onu factory sınıfımıza bildiriyoruz. Eğer sınıf belirtilen dizin içinde mevcutsa bize sınıfı başlatıp döndürüyor değil ise hata veriyor.
Bunun bize faydası sınıfları daha tertipli ve düzenli bir şekilde başlatma olanağı sağlıyor ve tek bir arayüz üzerinden istediğimiz değişikliğe gitmemize olanak sağlıyor.
Şöyle bir örnek verirsek sanırım daha iyi anlaşılacaktır. Farzedelim ki sınıflarınızı sayfalarınıza hep require veya include ile çağırdınız ve bir süre sonra sınıfları bir dizinde topladınız veya dizin adını değiştirdiniz. Ne yapmak lazım şimdi? Tüm sayfaları açıp require veya include satırlarını düzeltmek lazım. Ama eğer bunu factory pattern olarak düşünüp yazsaydık sadece factory classımızda değişiklik yaptığımızda tüm sitemizde uygulanmış olacaktı.
Umarım bişeyler aktarabilmişimdir.


Paylaşım için teşekkürler bu konular hakkında türkiyeden sitelerde kaynak bulmak gercekten cok zor … ilgilenenler icin diger bir kaynak htt://code.internet.com.tr olabilir
Güzel döküman. class yapısına yeni yeni alışıyorken bu tarz bir kolaylık çok işime yarıyacak
Güzel yazı teşekkürler. Anlamadığım bir nokta var. Nesneleri bir arayüz üzerinden yaratmanın partikte ne gibi bir faydası olabilir ? Sizin örneğinizde bahsettiğiniz nesnelerin bulundukları dosyaları include etme işlemini autoload() fonksiyonu ile de yapabilirdik ?