Tasarım desenleri(Design Patterns) yazılımcıların karşılaştığı sorunları minumuma indirmek için ortaya çıkmıştır. Creational(Kurucu), Structural(Yapısal), Behavioral(Davranışsal) olmak üzere 3 sınıfa ayrılır. Nesne tabanlı yazılımlar geliştirirken kodların birbirinden maksimum oranda bağımsız olması; yeniden kullanılabilir, kolayca geliştirilebilir ve değişiklik yapmamız gerektiğinde minumum kod yazarak müdahale edebileceğimiz yapıları ortaya çıkarmamızı sağlar. Böylece işgücünden ve zamandan maksimum faydayı elde ederiz.
Bu yazıda kurucu tasarım desenlerinden biri olan factory üzerine bir örnek paylaşacağım. Factory Design Pattern sayesinde sınıfları tek bir arayüz üzerinden oluşturabiliyoruz. Lafı daha fazla uzatmadan bir örnek üzerinden konuyu pekiştirelim.
"lib" isminde bir klasör oluşturalım. Bu klasör içinde "Mail.php" ve "Pagination.php" isminde 2 dosya oluşturalım. Bu dosyaların içinde, dosya ismi ile aynı olacak şekilde sınıflar tanımlayalım.
Mail.php : Class Mail
{
public function Send()
{
return '<p>Burası Mail Sınıfında Bulunan Send Fonksiyonu</p>';
}
}Pagination.php : Class Pagination
{
public function Initialize()
{
return '<p>Burası Pagination Sınıfında Bulunan Initialize Fonksiyonu</p>';
}
}"Lib" klasörünün bizim sınıflarımızı topladığımız bir alan olduğunu düşünelim. Mesela bir framework kullanırken tüm sınıfların bir klasör altında toplandığını ve bizim bunları bir sınıf üzerinden uygulamaya dahil ettiğimizi görebiliyoruz. Bizde buna benzer bir yapı ortaya çıkarmaya çalışalım. "Lib" klasörünün dışında bir .php dosyası oluşturalım ve buraya aşağıdaki kodları yazalım.
// "load" isminde bir sınıf tanımlıyorum.
Class Load
{
/*
* "Library" isminde bir statik fonksiyon tanımlıyorum.
* Bu fonksiyona sınıf ismini yolluyorum.
* Sınıf ismiyle dosya ismi aynı olmalı. (Sınıf ismiyle dosya include ettiğim için)
* Dosya varsa include edip sınıf objesini geriye döndüyorum.
*/
public static function Library($class)
{
try
{
$dir = 'Lib/' . $class . '.php';
if(file_exists($dir))
{
include_once $dir;
return new $class;
}
else
{
throw new Exception('<p>Sınıf Bulunamadı</p>');
}
}
catch(Exception $e)
{
echo $e->getMessage();
}
}
}
// "Pagination" sınıfında bulunan "Initialize" fonksiyonunu çağırıyorum.
echo Load::Library('Pagination')->Initialize();
// "Mail" sınıfında bulunan "Send" fonksiyonunu çağırıyorum.
echo Load::library('Mail')->Send();
// Olmayan bir sınıf çağırarak hata oluşturalım.
Load::library('Test');Kodlara açıklama satırları ekleyerek hangi satırda, hangi işlemi yaptığımızı açıklamaya çalıştım. Böylece her sınıfı uygulamada ayrı ayrı "new" operatörü ile tanımlamak yerine, "Load" sınıfında bulunan "Library" fonksiyonu aracılığıyla yüklemiş olduk.
Kaynak : http://www.webteders.com/blog/detay/...sign-Pattern/7