“Pratik, iyi bir noktaya geldikten sonra yaptığımız bir şey değildir. Sizi iyi bir noktaya getirmesi için yaptığımız bir şeydir.”
by Malcolm Gladwell Outliers S. 36

Factory Design Pattern(Fabrika Tasarım Şablonu)

Tarih: Mart 18th, 2012 | Yazar: | Kategoriler: Php, Tasarım Şablonları (Design Patterns) | Etiketler: , , | Yorum Yok »

Tasarım şablonları yazı dizisine tasarım şablonlarının bana ne ifade ettiğini anlatarak bir önceki yazımda giriş yapmıştım. Bu yazımda ise Oluşturucu Tasarım Şablonlarının(Creational Design Patterns) bir üyesi olan Factory Design Pattern(Fabrika Tasarım Şablonu) ile devam edeceğim.

Onlarca uçağım var. Boeing, Airbus, Cessna marka, onlarca boy boy, çeşit çeşit uçağım var. Tüm bu uçakları da kendim üretiyorum. Bir fabrikam yok, nasıl üretileceğini aklımda tutuyorum yeri gelince aklımda tuttuğum bu şeyleri kullanarak istediğim uçağı üretebiliyorum. Hemen şimdi size bir tane Boeing 747-8 üreteyim.

Önce sınıflarımıza bakalım;

namespace DesignPatters\Factory;

abstract class AbstractAircraft
{
    public $cruisingSpeed;
    public $model;
}
class Boeing extends AbstractAircraft {}
class Airbus extends AbstractAircraft {}
class Cessna extends AbstractAircraft {}

Ve üretim…

$aircraft = new \DesignPatters\Factory\Boeing();
$aircraft->model = '747-8';
$aircraft->cruisingSpeed = 917;

Artık Boeing 747-8 modelinde bir uçağımız var. Bu uçağı Türk Hava Yollarına hediye ediyorum. Malum ellerinde hiç jumbo jet yok benden armağan olsun. THY uçağı İstanbul Atatürk Havalimanı – Ankara Esenboğa Havalimanı arasında kullanıyor.
THY Boeing 747-8’i çok beğenmiş bir tane daha istiyor. Tabii diyorum ve hemen bir tane daha üretiyorum.

$aircraft = new \DesignPatters\Factory\Boeing();
$aircraft->model = '747-8';
$aircraft->cruisingSpeed = 917;

Bu uçağıda İstanbul Atatürk Havalimanı – John F. Kennedy International Havalimanı arasında kullanmaya başlıyorlar.

İşler çok iyi gidiyor. Her gün yeni bir uçak talebi geliyor çeşitli havayolu şirketlerinden. 3 ay sonra 100 küsur tane uçak üretip vermişim havayolu şirketlerine. Bir gün THY’den telefon geliyor bu uçakların yolcu sayısı bilgisi yok diyor telefondaki görevli. Hemen ekleyelim diye de ekliyor. Tamam diyorum ben de hiç tereddüt etmeden. Niye tereddüt edeyim ki AbstractAircraft sınıfına passengers adında yeni bir property(özellik) eklerim olur biter. Ekliyorum da..

abstract class AbstractAircraft
{
    public $cruisingSpeed;
    public $model;
    public $passengers;
}

Düşündüğüm gibi ilk aşama oldukça kolay oldu. Şimdi tüm ürettiğim uçaklara yolcu sayısını girmem gerekiyor yani ürettiğim 100 küsur uçağa tek tek kendilerine ait yolcu sayısı bilgisini girmem gerekiyor…

Offf! Ben 100’den fazla yerde ayrı ayrı uçak üretimi yapmışım. Şimdi bunların hepsine yolcu sayısı bilgisi eklemem için bu yerleri tek tek bulup düzenlemem gerekiyor. Akılsız başın cezasını parmaklar çekiyor ve ben 100’den fazla üretim yaptığım yeri bulup yolcu sayısı verisini eklemeye başlıyorum. Umarım herhangi birinde hata yapmam. Yapacağım iş basit olsa bile herhangi birini unutmam oldukça muhtemel çünkü 100’den fazla uçak üretim yerini tespit edip düzenleme yapmam gerekiyor. Birini unutmam çok büyük sorunlara neden olabilir 🙁

Başarısız bir programcılık hikayesi ile başlamak istedim bu yazıma. Peki yukarıda hikayenin öznesi olmak istemiyorsak ne yapmalıyız? İşte bunun cevabı Fabrika Tasarım Şablonun’da gizli.

Şablonumuzun ismi Fabrika. Gerçek dünyada ki bir fabrikayı düşünelim. Fabrikaya bir emir gönderilir. Bu emir şu şekilde olabilir; Bana Boeing’in 747-8 modelinden bir uçak üret. Fabrika bu talebi değerlendirir ve üretimi Boeing 747-8’e göre gerçekleştirir.

O zaman gerçek dünyada ki fabrikayı yazılım dünyasına uyarlayalım…

class Factory
{
    public static function create($model)
    {
        switch ($model) {
            case 'Boeing 747-8':
                $aircraft = new Boeing();
                $aircraft->model = '747-8';
                $aircraft->cruisingSpeed = 917;
                break;
            case 'Airbus a380':
                $aircraft = new Airbus();
                $aircraft->model = 'a380';
                $aircraft->cruisingSpeed = 945;
                break;
            default:
                throw new \RuntimeException('Undefined aircraft');
        }
        return $aircraft;
    }
}

Fabrikamızı çalıştırıp üretimi gerçekleştirelim.

$aircraft = \DesignPatters\Factory\Factory::create('Boeing 747-8');

Gördüğünüz gibi artık bir uçak üretirken o uçağın cruising speed değerini, model numarasını bilmemize gerek kalmadı. Bunları bizim adımıza bilip kullanan biri var o da uçak fabrikamız.

Yukarıdaki başarısızlık hikayesinde Fabrika Tasarım Şablonu kullandığımızı düşünelim. Yine 100 küsur uçak ürettik farklı yerlerde bunları kullandık. Ama bu sefer bu uçakların üretimini fabrikamız üzerinden gerçekleştirdik. Ve yine THY bizden uçaklara yolcu sayısı bilgisini eklememizi istedi. Hemen fabrikamızda bu isteği gerçekleştirdik.

class Factory
{
    public static function create($model)
    {
        switch ($model) {
            case 'Boeing 747-8':
                $aircraft = new Boeing();
                $aircraft->model = '747-8';
                $aircraft->cruisingSpeed = 917;
                $aircraft->passengers = 500;
                break;
            case 'Airbus a380':
                $aircraft = new Airbus();
                $aircraft->model = 'a380';
                $aircraft->cruisingSpeed = 945;
                $aircraft->passengers = 853;
                break;
            default:
                throw new \RuntimeException('Undefined aircraft');
        }
        return $aircraft;
    }

}

Fabrikamızın son hali bu şekilde. Artık 100’den fazla uçağımızın hepsi yolcu sayısını biliyor. Ve bu işlemi yaparken sadece bir tek yerde düzenleme yaptık. Sadece fabrikamızda.

Gördüğünüz gibi fabrika tasarım şablonunu kullanarak daha sonra yapacağımız düzenlemeleri kolaylıkla uygulayabiliyoruz.

Fabrika Tasarım Şablonunu Kullanmanın Bize Getirileri;

  • Fabrika tasarım şablonu ile kod tekrarını(duplication of code) önüne geçiyoruz. (Yukarıdaki örnekte her üretimde yolcu sayısını tek tek girmemiş olduk)
  • Fabrika tasarım şablonu ile nesneleri kullanan kullanıcılar, nesneler hakkında çok daha az bilgiye ihtiyaç duyuyor. (Yukarıdaki örnekte uçağı kullanan her bir kullanıcı artık o uçağın yolcu sayısını bilmek zorunda değil)
  • Fabrika tasarım şablonu ile çok daha esnek bir yapı elde etmiş oluruz.

Bu yazımda kullandığım örneğin kodlarına buradan ulaşabilirsiniz.