Factory Design Pattern

Factory design pattern, nesnelerin nasıl daha etkin bir şekilde oluşturulabileceği ile ilgili, getirdiği avantajlar herkesçe kabul edilen bir yazılım tasarım desenidir.

Temel sınıf nesnesini/nesnelerini oluşturan bir factory (fabrika) sınıf vardır. Nesneler temel sınıflar üzerinden değil, factory sınıf üzerinden türetilir.

Client code (istemci kod, bir diğer deyişle sınıfı kullanacak olan kod), factory sınıfa nesne türetme isteği yapar. Factory sınıf ise istemciye uygun bir nesne döndürür. Factory sınıfın temel görevi, istemcinin istediği nesneyi hangi sınıftan nasıl türeteceğini ondan soyutlamaktır.

Bir başka açıklama: mantıksal olarak gruplanabilecek sınıfları gruplayıp bir fabrika edasıyla factory sınıf üzerinden çağırmaktır.

PHP ile Factory Design Pattern

// Film class
class Film
{
}
// Serial class
class Serial
{
}
// Book class
class Book
{
}
// Factory class
class Factory
{
	public static function create($type)
	{
		return new $type;
	}
}
// Client code
$film 	= Factory::create('Film');
$serial = Factory::create('Serial');
$book 	= Factory::create('Book');

Burada benim gördüğüm bir avantaj, temel sınıfların isminin değişikliğinden kodun en az şekilde etkilenmesidir. Film, Serial veya Book sınıflarından new operatörüyle direk türetilmiş nesneler olsaydı, olası bir isim değişikliğinde kodun her yerinde sınıfın ismini değiştirmek gerekecekti. Factory design pattern’de ise sadece factory sınıfını değiştirmek yeterli olacaktır.

Factory sınıfında create metodunun static tanımlanmasının da büyük bir avantajı var. Static olmasaydı ve new operatörüyle factory nesnesi oluşturulup, bu nesne üzerinden create metodu çağrılsaydı, hem factory nesnesi oluşturmuş hem de uygun bir temel sınıf nesnesi oluşturmuş olacaktık. Create metodu static tanımlandığı için sadece temel sınıf nesnesi türetilmiş oldu.

// Bu kullanımda elimizde 2 nesne için instance oluşacak.
// Factory nesnesi
// Film nesnesi
$film = new Factory();
$film->create('Film');

Factory design pattern, her zaman kullanılan bir çözüm değildir. Basit bir sınıf hiyerarşisinde kullanmak mantıklı olmayabilir. Sınıf hiyerarşisi büyüdükçe, oluşturulacak objelerin kontrollü bir şekilde oluşturulması gerektiğinde, kısacası kompleks yapılar oluşmaya başladığında, factory design pattern kullanmaya mecbur kalabilirsiniz. Veya kullanmamakta ısrar edip, karmaşık ve çağ dışı kod yazmaya devam edebilirsiniz.

Şunu belirtmekte de fayda var; herşeyi factory sınıflar üzerinden yaparsanız, factory sınıfı kim türetecek ? Bir başka factory ? Peki ya o factory’yi ?

Factory design pattern teorik olarak çok da zor birşey değil. Ama tam olarak anlamak için ihtiyacını hissetmek gerekir. Bu yüzden yazdığım yazı eksik veya tam olarak doğru olmayabilir. Yeni şeyler öğrendikçe yazmaya çalışacağım.

Benzer Yazılar

Yorumlar

  • turgay , 02 Mart 2014 - 19:49:19

    Güzel bir yazı olmuş. Tasarım şablonları hakkında yeni yazılar yazman dileğiyle.

    Cevapla
  • Erdal , 02 Mart 2014 - 22:20:24

    Sınıf ismini değiştirme durumu çok hoşuma gitmişti zira bir keresinde başıma gelmişti.

    Cevapla
  • Resul ASLAN , 30 Mayıs 2014 - 10:06:25

    Factory design pattern kullanılırken aynı tipteki sınıfları türetmek için kullanılmalı.

    Örneğin : e-ticaret sisteminde kargo için :

    $kargo = new KargoFabrikasi($siparis.secilenKargo);
    şeklindeki kullanım daha açıklayıcı olacaktır.
    Sisteme yeni bir kargo eklenmek istendiğinde yada aktif pasif yapmak istediğinizde KargoFabrikasi sınıfında gerekli kontroller sağlanabilir.

    Buraya uzun örnek yazamıyorum ancak Fabrika deseni sınıf çağırmak yerine aynı türden sınıfları sisteme kolay entegre etmek için kullanılırsa daha verimli olur diye düşünüyorum.

    Cevapla

Yorum Yazın

Su elementleri kullanabilirsiniz : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Arama
RSS
Beni yukari isinla