Fabrika Tasarım Kalıbı (Factory Design Pattern)

Eyl 08, 2013

Yaratımsal tasarım kalıplarından olan fabrika metodu nesnenin nasıl yaratılacağını kalıtım yoluyla alt sınıflara bırakıp nesne yaratımı için tek ara yüz kullanarak, ara yüzle nesne yaratım işlevlerini temelde birbirinden ayırmaya yarayan yaratımsal tasarım desenidir. En kolay anlatımı ile oluşturulan fabrika yapısındaki bilgiye bağlı olarak, çok sayıdaki benzer sınıflar arasından doğru seçimi yapıp gereken nesnenin yaratılmasını sağlar. Fabrika tasarım kalıbının temel yapısı aşağıdaki şekildedir.

Konunun daha açıklayıcı olması için "Fabrika Tasarım Kalıbı" kullanılan örnek bir program şu şekilde yazılır. Programda, kullanıcıdan ad ve soyad girilmesi istenir. Kullanıcı bu girişi iki farklı şekilde yapabiliyor olsun. Bu iki format ( İsim Soyisim ve Soyisim, İsim ) şeklinde belirlenir. Kullanıcıdan farklı formatlarda aldığımız tam (ad+soyad) isimden ad ve soyad bilgileri elde edilir.

Belirlenen senaryoya göre; ad ve soyad bilgilerine sahip TamIsim adında bir sınıf oluşturulsun. TamIsim sınıfının ad ve soyad değişkenleri üst sınıfların da erişebilmesi için protected olarak belirlenir.

public class TamIsim
    {
      protected string ad, soyad;
        public string adGetir()
        {
            return ad;
        }
        public string soyadGetir()
        {
            return soyad;
        }
    }
İki farklı formatta isim girişi yapılacağı için her bir format için TamIsim sınıfından türetilmiş farklı sınıflar aşağıdaki şekilde yazılır. "İsim Soyisim" şeklinde girilen bilgi için oluşturulan sınıfa BoslukluIsim adı verilmiştir. Kodlardan da anlaşılacağı üzere sınıf, yapıcısında string bir değişken almaktadır. Bu değişken İsim Soyisim formatındaki tam ismi içermektedir. Sonrasında ise aradaki boşluk yardımı ile ad ve soyad bilgileri elde edilir. Ardından da miras aldığı ad ve soyad üyelerine elde edilen bu değerler atanır.
public class BoslukluIsim : TamIsim
    {
        public BoslukluIsim(string isim)
        {
            int i = isim.IndexOf(" ");
            if (i > 0)
            {
                ad = isim.Substring(0, i).Trim();
                soyad = isim.Substring(i + 1).Trim();
            }
            else
            {
                soyad = isim;
                ad = "";
            }
        }
    }

Soyisim, İsim şeklinde girilen bilgi için oluşturulan sınıfa VirgulluIsim adı verilmiştir. Sınıf, diğer sınıfa benzer şekilde string yapıcısı sayesinde girilen değişik formattaki ismi alır. Sonrasında aradaki virgül kullanılarak ad ve soyad bilgileri elde edilir. En sonunda ise miras alınan ad ve soyad üyeleri elde edilen bilgilerle doldurulur.

public class VirgulluIsim : TamIsim
    {
        public VirgulluIsim(string isim)
        {
            int i = isim.IndexOf(",");
            if (i > 0)
            {
                soyad = isim.Substring(0, i);
                ad = isim.Substring(i + 1).Trim();
            }
            else
            {
                soyad = isim;
                ad = "";
            }
        }
    }

Kullanıcı, hangi formatta bilgi giriş yaparsa yapsın TamIsim sınıfından bir nesne yaratan sınıfa da IsimFabrikasi adı verilmiştir. Kodlardan da anlaşılacağı üzere sınıf, string tipinde parametre alan TamIsim tipinde nesne döndüren getirIsim adında bir metoda sahiptir. Alınan parametre, içinde virgül olup olmama durumuna göre uygun sınıfın yapıcısına yönlendirilerek TamIsim sınıfından bir nesne yaratılır.
public class IsimFabrikasi
    {
        public IsimFabrikasi() { }
        public static TamIsim getirIsim(string isim)
        {
            int i = isim.IndexOf(",");
            if (i > 0)
            {
                return new VirgulluIsim(isim);
            }
            else
            {
                return new BoslukluIsim(isim);
            }
        }
    }
Son olarak da aşağıdaki kodlar ile her iki formatta da programın ara yüzünden alınan bilgiler ışığında TamIsim sınıfından nesne üretilip, nesneden ad ve soyad bilgileri elde edilir.

private void btnGetir_Click(object sender, EventArgs e)
        {
            TamIsim isim = IsimFabrikasi.getirIsim(txtTamIsim.Text);
            txtAd.Text = isim.adGetir();
            txtSoyad.Text = isim.soyadGetir();
        }

Aşağıdaki ekran çıktılarında, tam ismin farklı iki formatta girildiği ve aynı sonucun elde edildiği örnek programın ekran görüntüleri görülmektedir. Tam isim, üstteki pencerede boşluk kullanılarak, alttaki pencerede ise virgül kullanılarak girilmiş ve her iki pencerede de ad ve soyad değerleri fabrika tasarım kalıbı ile yaratılan isim nesnesinden elde edilmiştir.