TASARIM DESENLERİ YAZI DİZİSİ 1-Abstract Factory (Soyut Fabrika)

Creational Patterns (Yaratıcı Tasarım Desenleri) grubu altında yeralan Abstract Factory tasarım deseni birbiri ile ilişkili nesnelerin oluşturulması sırasında istemcinin nesneler ile değil nesneleri üreten fabrikalar ile konuşmasını sağlayan tasarım desenidir.

Peki istemcinin nesne yerine nesneleri üreten fabrikalarla konuşması bizlere ne gibi fayda sağlamaktadır?
    • Tek bir üretici metod kullanılarak farklı nesne tipleri üretilebilir.
    • Desen içeriğine yazılan kodların değişmesi durumunda istemci tarafında yazılmış olan kodların değiştirilmesine gerek yoktur.
    • Nesne yerine üretici fabrika kullanılması nedeniyle desen içeriğine yeni nesne tipleri kolaylıkla eklenebilir.

Aslında Abstract Factory tasarım desenini kutu üreten bir işletmeye benzetebiliriz. Bu işletme çeşitli boy ve renklerde kutular üretmektedir. Fakat üretilen ürünlerin özellikleri farklı olmasına rağmen üretim esnasında aynı makine ve aynı elemanlar bulunmaktadır. Buna ek olarak sipariş veren müşteri üretim ile ilgili hiçbir bilgiye sahip değildir ve buna ihtiyacı da yoktur. Onun ihtiyacı olan tek şey sipariş vermiş olduğu kutunun üretim sonrası eline geçmesidir. İşte Abstract Factory tasarım deseni ile oluşturmuş olduğumuz sınıflarımızın kullanımında da istemcinin ihtiyacı olan tek bilgi nesnenin oluşturularak kullanıma sunulmasıdır.

Şimdi belirtmiş olduğumuz Kutu üreten işletmemizi ve işletmemize ait üretimi yapılan küçük ve Büyük kutu adlı 2 nesnemizi Abstract Factory Tasarım deseni ile tasarlayalım.
Kutularımız başlangıçta 2 adet ancak belki de daha sonradan farklı boyutlarda kutu üretimine de başlayabiliriz. Bu sebeple ilk olarak kutularımızın boyutlarını belirleyebileceğimiz sınıfımızı oluşturalım.

public abstract class BoyutAyarlar
{
    public abstract void Genislik(int deger);
    public abstract void Uzunluk(int deger);
    public abstract void Derinlik(int deger);
}

Kutularımızın boyutlarını belirleyebileceğimiz sınıfımızı her kutumuza ait kullanılacak boyut bilgileri farklı olabileceği için Abstract sınıf olarak tanımladık. Her üretilecek kutunun da rengi farklı olabilir değil mi? Bunun için kutu renklerimizi belirleyebileceğimiz sınıfımızı da Abstract olarak tanımlayalım.

public abstract class RenkAyarlar
{
    public enum Renkler
    {
        Beyaz,Siyah,Kırmızı,Mavi,Sarı
    }
 
    public abstract void Renk(Renkler RenkDegeri);
}

Artık işletmemize ait üretilebilecek Kutu tiplerimizi tanımlayabiliriz. Kutu tiplerimizi tanımlarken her kutunun özellikleri arasında farklı boyut ve renk olabileceğinden kutularımıza ait sınıflarımızı Boyut ayarlar ve Renk Ayarlar sınıflarından türetmemiz gereklidir.

public class KucukKutuBoyut:BoyutAyarlar
{
    public override void Genislik(int deger)
    {
        Console.WriteLine("Küçük Kutunun genişliği " + deger.ToString() + " olarak ayarlandı");
    }
 
    public override void Uzunluk(int deger)
    {
        Console.WriteLine("Küçük Kutunun uzunluğu " + deger.ToString() + " olarak ayarlandı");
    }
 
    public override void Derinlik(int deger)
    {
        Console.WriteLine("Küçük Kutunun derinliği " + deger.ToString() + " olarak ayarlandı");
    }
}
 
public class BuyukKutuBoyut : BoyutAyarlar
{
    public override void Genislik(int deger)
    {
        Console.WriteLine("Büyük Kutunun genişliği " + deger.ToString() + " olarak ayarlandı");
    }
 
    public override void Uzunluk(int deger)
    {
        Console.WriteLine("Büyük Kutunun uzunluğu " + deger.ToString() + " olarak ayarlandı");
    }
 
    public override void Derinlik(int deger)
    {
        Console.WriteLine("Büyük Kutunun derinliği " + deger.ToString() + " olarak ayarlandı");
    }
}
 
public class KucukKutuRenk : RenkAyarlar
{
    public override void Renk(RenkAyarlar.Renkler RenkDegeri)
    {
        Console.WriteLine("Küçük Kutunun rengi " + RenkDegeri.ToString() + " olarak ayarlandı");
    }
}
 
public class BuyukKutuRenk : RenkAyarlar
{
    public override void Renk(RenkAyarlar.Renkler RenkDegeri)
    {
        Console.WriteLine("Büyük Kutunun rengi " + RenkDegeri.ToString() + " olarak ayarlandı");
    }
}

İşletmemize ait üretilebilecek kutu tiplerini tanımladığımıza göre sıra üretim aşamasında yapılacak işlemlere geldi.

public abstract class UretimAsamasi
{
    public abstract BoyutAyarlar BoyutIslem();
 
    public abstract RenkAyarlar RenkIslem();
}

Üretim aşaması basit olarak boyutlandırma ve renklendirme olarak iki aşamadır. Bu durumda her yeni kutu üretim talebinde bu işlemler yeniden yapılacağından kutularımızı Uretim aşaması sınıfından türetmeliyiz.

public class KucukKutu : UretimAsamasi
{
    public override BoyutAyarlar BoyutIslem()
    {
        return new KucukKutuBoyut();
    }
 
    public override RenkAyarlar RenkIslem()
    {
        return new KucukKutuRenk();
    }
}
 
public class BuyukKutu : UretimAsamasi
{
    public override BoyutAyarlar BoyutIslem()
    {
        return new BuyukKutuBoyut();
    }
 
    public override RenkAyarlar RenkIslem()
    {
        return new BuyukKutuRenk();
    }
}

İşleyiş ile ilgili tüm tanımlamaları yaptığımıza göre artık üretime geçebiliriz. Üretim sürecinde bize lazım olanlar üretilecek kutunun tipi ,boyutları ve rengidir. Bu bilgilerden tip verisini siparişin (nesnenin) oluşturulması aşamasında boyut ve renk bilgilerini ise uretim işlemine ait metodun çalıştırılması sırasında alıyoruz.

public class KutuUretim
{
    private UretimAsamasi _kutu;
    private BoyutAyarlar _boyutlar;
    private RenkAyarlar _secilenrenk;
 
    public KutuUretim(UretimAsamasi UretilecekKutu)
    {
        _kutu = UretilecekKutu;
        _boyutlar = UretilecekKutu.BoyutIslem();
        _secilenrenk = UretilecekKutu.RenkIslem();
    }
 
    public void Uret(int kutugenisligi,int kutuuzunlugu,int kutuderinligi,RenkAyarlar.Renkler kuturengi)
    {
        _boyutlar.Genislik(kutugenisligi);
        _boyutlar.Uzunluk(kutuuzunlugu);
        _boyutlar.Derinlik(kutuderinligi);
        _secilenrenk.Renk(kuturengi);
    }
}

Artık tek yapmamız gereken siparişin gelmesini (istemci talebini) beklemektir.

KutuUretim uret = new KutuUretim(new BuyukKutu());
uret.Uret(30, 40, 20, RenkAyarlar.Renkler.Kırmızı);

Gördüğünüz gibi istemci tarafından oluşturulan nesnenin nasıl oluştuğu yada oluşması aşamasında hangi adımlardan geçtiğinin hiçbir bilgisi bulunmamakta. İstemcide yapılan sadece nesne üretme ve üretilecek nesneye ait özelliklerin belirlenmesi sonrası üretime başlanmasının talebidir. Bu sayede biz desenimiz içeriğine ortaboy kutu, yuvarlak kutu vb.. kutu tipleri eklediğimiz de istemci tarafında var olan kodlarda hiçbir değişiklik olmayacak ancak talebe göre yeni eklenen tiplerden nesne üretimi yapılacaktır. Bu makalede kullanılan tasarım desenine ait kodu indirmek için ………..

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir