24 / 06 / 2009
factory method design pattern – php
ekleyen: Emre Çevik kategori: design patterns| php
Merhaba size bu yazıda, factory ( fabrika ) method design pattern hakkında bilgi vermeye çalışacağım.
Bir fabrika tasarım şablonu, kendisine gönderilen parametrelere göre var olan sınıflardan istediğimizi oluşturur ve bize döndürür. Genellikle geriye döndürülen tüm sınıflar ortak bir ebeveyn sınıfından yada arayüzünden oluşturulmuştur.
Amaç nesnelerin yaratımı için bir arayüz sağlamak. Ancak hangi nesnenin yaratılacağı kararını bu arayüzü gerçekleştiren altsınıflara bırakmak.
php.net factory ile ilgili ne demiş :
Factory
The Factory pattern allows for the instantiation of objects at runtime. It is called a Factory Pattern since it is responsible for “manufacturing” an object. A Parameterized Factory receives the name of the class to instantiate as argument.

evet şimdi php.net sayfasındaki örneği kendimize göre düzenleyip inceleyelim.
factory.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php class Database { // The parameterized factory method public static function factory($type) { if (include_once ($type . '.php')) { $classname = $type; return new $classname; } else { throw new Exception ('Driver not found'); } } } $mysql = Database::factory('mysql'); $mysql->db_connect(); $mssql = Database::factory('mssql'); $mssql->db_connect(); ?> |
Aşağıdaki satırda görüldüğü üzere Database sınıfına $type olarak gönderilen parametre var ise bu parametre adında bir sınıf oluşturmasını ve bize bu sınıfı geri göndermesini istemişiz.
1 2 3 4 | if (include_once ($type . '.php')) { $classname = $type; return new $classname; } |
Aşağıdaki kod parçasında Database sınıfına mysql adında bir sınıf türetmesini söylemişiz.
1 | $mysql = Database::factory('mysql'); |
Artık $mysql adında yeni sınıfımızı türettik. Şimdi bu sınıfın elemanlarına ulaşabiliriz.
1 | $mysql->db_connect(); |
Bu kod ekrana mysql.php nin db_connect() methodunu yazdıracaktır. şimdi mysql ve mssql sınıflarını yazalım.
mysql.php
1 2 3 4 5 6 7 8 9 10 | <? class Mysql { // The parameterized factory method public function db_connect() { echo "mysql veritabanına baglandı"; } } ?> |
mssql.php
1 2 3 4 5 6 7 8 9 10 | <? class Mssql { // The parameterized factory method public function db_connect() { echo "mssql veritabanına baglandı"; } } ?> |
şimdi yeni bir örnekle bu yazılanları kavramaya çalışalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | <?php // Bu sınıf butun moduller için ortak bilgileri içerir. abstract class Modul { public function bilgiGetir(){ echo $this->type; } } // Galeri modülü ile ilgili modulleri içerir. class Galeri extends Modul{ private $type = "Galeri modülü"; public function bilgiGetir(){ echo $this->type; } } // Haber modülü ile ilgili modulleri içerir. class Haber extends Modul{ private $type = "Haber modülü"; public function bilgiGetir(){ echo $this->type; } } // Makale modülü ile ilgili modulleri içerir. class Makale extends Modul{ private $type = "Makale modülü"; public function bilgiGetir(){ echo $this->type; } } // Modül fakbirakası. İstenilen modülü oluşturup, geri gönderir. class ModulFabrika { const GALERI = "Galeri"; const HABER = "Haber"; const MAKALE = "Makale"; public static function modulOlustur($modul){ switch($modul){ case self::GALERI: return new Galeri(); break; case self::HABER: return new Haber(); break; case self::MAKALE: return new Makale(); } throw new Exception ('Modul yuklenemedi.'); } } // fabrikamızı oluşturalım $modul = new ModulFabrika(); // modül oluşturalım $galeri = $modul->modulOlustur(ModulFabrika::GALERI); // modül bilgisini alalım $galeri->bilgiGetir(); $haber = $modul->modulOlustur(ModulFabrika::HABER); $haber->bilgiGetir(); $makale = $modul->modulOlustur(ModulFabrika::MAKALE); $makale->bilgiGetir(); ?> |
Yukarıdaki kod bloğunu incelediğimizde yapının aynı olduğunu görürüz. Öncelikle fabrikamızı oluşturuyoruz. Daha sonra çalışacağımız modülü seçiyoruz ve modül bilgisini getiriyoruz.
1 2 3 4 5 6 | // fabrikamızı oluşturalım $modul = new ModulFabrika(); // modül oluşturalım $galeri = $modul->modulOlustur(ModulFabrika::GALERI); // modül bilgisini alalım $galeri->bilgiGetir(); |
dosya : factory design pattern
Yazıya ek olarak OReilly oluşturduğu fabrika tasarım şablonunu ekliyorum. Örnek olarak onuda inceleyebilirsiniz.
dosya : OReily : factory method design pattern
Bundan sonraki yazımda sizelere singleton veya prototype design pattern hakkında bilgi vereceğim. hangisi hakkında ve ne zaman yazacağıma henüz karar veremedim. belki birazdan onun yazımınada başlayabilirim.
benzer konular:














design patterns