Harun Özer


Proje veya dijital katalog yaptırmak için
iletişim formu doldurabilirsiniz..

<< Singleton Tasarım Deseni - Singleton Design Pattern | Builder Tasarım Deseni - Builder Design Pattern>>

Abstract Factory Tasarım Deseni - Abstract Factory Design Pattern

Yazar harunozer 10 October 2012

Abstract Factory Tasarım Deseni - Abstract Factory Design Pattern Abstract factory (fabrika) tasarım deseni creational grubununa ait bir tasarım desenidir. dofactory.com a göre en çok kullanılan tasarım desenlerinden biri olan abstract factory tasarım deseninin amacı; birbirleri ile ilişkili sınıfların oluşturulmasını düzenlemektir.

Aralarında ilişki bulunan nesnelerin üretiminden sorumlu olan soyut fabrikaların tasarlandığı tasarım deseni olarak düşünülebilinir. Abstract Factory tasarım deseni sayesinde böyle durumlarda bu nesneler her oluşturulduğunda if gibi karar mekanizması yazmaya gerek kalmaz. Abstract factory deseninin uygulanabilinmesi için bu desendeki nesnelerin aynı abstract class veya interface i uygulamış olması gerekir. Bu desen üretilen nesnelerin uyguladıkları arayüzler ile ilgilendiğinden desene yeni bir nesne eklemek kolaydır.

Abstract factory tasarım deseninde aynı soyut sınıfı veya interface i  uygulayan sınıfların örneğini veren fabrika sınıfları olur. Bu nesnelerin örnekleri bu fabrika sınıflarından elde edilir. Ve client da kullanılan bu nesnelerin yönetildiği base bir fabrika sınıfı yazılır. Abstract factory tasarım desenindeki temel nesne grupları şöyledir;

 

Her ürünümüz için (ram ve hdd) arayüz oluşturup(RamAbstract ve HddAbstract abstract sınıfları) gerçek ürünlerimizde(Concrete1 ve Concrete2 ile biten gerçek sınıflarımız)de bu arayüzleri uygulayalım. Böylece farklı türlerdeki ürünlerimiz için ortak bir yapı oluşturmuş olduk.

public abstract class HddAbstract

{

    public abstract void HddIslem();

    public abstract string HddTur { get; }

}

public abstract class RamAbstract

{

    public abstract void RamIslem();

    public abstract string RamTur { get; }

}

public class HddConcrete1:HddAbstract

{

    public override void HddIslem()

    {

        Console.WriteLine("HddConcrete1 birleştirildi.");

    }

    public override string HddTur

    {

        get { return "Bu hdd türü: HddConcrete1"; }

    }

}

public class HddConcrete2 : HddAbstract

{

    public override void HddIslem()

    {

        Console.WriteLine("HddConcrete2 birleştirildi");

    }

    public override string HddTur

    {

        get { return "Bu hdd türü: HddConcrete2"; }

    }

}

public class RamConcrete1 : RamAbstract

{

    public override void RamIslem()

    {

        Console.WriteLine("RamConcrete1 birleştirildi");

    }

    public override string RamTur

    {

        get { return "Bu ram türü: RamConcrete1"; }

    }

}

public class RamConcrete2 : RamAbstract

{

    public override void RamIslem()

    {

        Console.WriteLine("RamConcrete2 birleştirildi");

    }

    public override string RamTur

    {

        get { return "Bu ram türü: RamConcrete2"; }

    }

}

Senaryomuza göre her pc türü için bu sınıflar farklı oluşturulacaktır. Bunu yönetmek için bu sınıfların üretildiği başka bir yapı daha(PcFactory abstract classı) oluşturalım. Bu arayüzde; RamAbstract ve HddAbstract arayüzünden türeyen sınıfların örneklerini oluşturan abstract metotlar tanımlayalım(CreateHdd ve CreateRam). Tabiki bu arayüzü kullanacak sınıflar ekleyip, bu metotlarda; ilgili concrete sınıflarını oluşturan kodlamayı yapıyoruz.

public abstract class PcFactory

{

    public abstract HddAbstract CreateHdd();

    public abstract RamAbstract CreateRam();

}

public class Concrete1Factory : PcFactory

{

    public override HddAbstract CreateHdd()

    {

        return new HddConcrete1();

    }

    public override RamAbstract CreateRam()

    {

        return new RamConcrete1();

    }

}

public class Concrete2Factory : PcFactory

{

    public override HddAbstract CreateHdd()

    {

        return new HddConcrete2();

    }

    public override RamAbstract CreateRam()

    {

        return new RamConcrete2();

    }

}

Yani Concrete2Factory sınıfı;  RamConcrete2 sınıfını ve HddConcrete2 sınıfını oluşturacak, Concrete1Factory sınıfı;  RamConcrete1 sınıfını ve HddConcrete1 sınıfını oluşturacak. Son olarak da bütün bu yapıyı yöneteceğimiz Factory sınıfını oluşturalım. Bu sınıfın içinde concrete arayüzünden türetilen sınıflarımızı temsil eden tanımlamaları ve bu concrete sınıflarının üretiminden sorumlu olan PcFactory arayüzünden türetilen sınıfımızı temsil eden bir tanımlama yapalım.

public class Factory

{

    private PcFactory _pcFactory;

    private HddAbstract _hddAbstract;

    private RamAbstract _ramAbstract;

    public Factory(PcFactory pcFactory)

    {

        _pcFactory = pcFactory;

        _hddAbstract = _pcFactory.CreateHdd();

        _ramAbstract = _pcFactory.CreateRam();

    }

    public void Birlestir()

    {

        Console.WriteLine(_hddAbstract.HddTur);

        _hddAbstract.HddIslem();

        Console.WriteLine(_ramAbstract.RamTur);

        _ramAbstract.RamIslem();

    }

}

Şimdi de oluşturduğumuz bu yapıyı kullanalım.

classProgram

{

    static void Main(string[] args)

    {

        Factory f = new Factory(new Concrete1Factory());

        f.Birlestir();

        Console.WriteLine();

        f = new Factory(new Concrete2Factory());

        f.Birlestir();

        Console.ReadKey();

    }

}

Görüldüğü üzere hangi türden nesnelerin üretileceğini Factory sınıfını oluştururken constructor da verdiğimiz Concrete1Factory veya Concrete2Factory sınıfları ile belirttik. RamConcrete ve HddConcrete nesnelerinin üretimini bu sınıflara bıraktığımız için karar vermemiz gereken tek şey Concrete1Factory türünden mi Concrete2Factory türünden mi Ram ve Hdd sınıflarının üretileceğidir. Sonradan senaryomuza Ultrabook eklememiz gerekir ise sadece Ultrabook için sınıfları oluşturmamız ve ilgili yerlerde kullanmamız gerekir. AbstractFactory deseni generic kullanılarak daha etkin bir şekilde de kullanılabilinir. Gerçek kodlamadan örnek vermemiz gerekir ise birden fazla türde örneğin hem SqlServer hem Oracle veritabanı kullanacak bir uygulama yazarken abstract factory tasarım deseninden faydalanılabilinir.

Örnek uygulamayı aşağıdaki linkden indirebilirsiniz.

AbstractFactorySamplePc.rar

Tam Sayfa
Tags tasarım desenleri,
Kategoriler c#.net, Tasarım Desenleri
İşlemler
Bu Makale 6  Kez Beğenildi.
İsim :    
e-Mail :    
Web Site :  
İmage :  
Güvenlik Kodu :  

Güvenlik Resmi
Resmi Yenile
    
Yorum :  
Tasarım Desenleri ve Mimarileri