C# Factory Method Design Pattern Örneği

 

Mavi ve Kımızı Bilyeler
C# ile Factory Method Design Pattern(kısaca Factory Deseni), bir interface ya da abstract sınıfı kalıp olarak kullanıp tek bir sınıf örneğini kullanarak farklı nesneler üretmek için kullanılır. Oluşturulan bu nesne her çağrıldığında sahip olduğu factory metodu sayesinde aynı metot ve değişken isimlerini kullanan farklı nesneler oluşturur. Siz metoda hangi tip nesneye ihtiyacınız olduğunu söylersiniz o da eğer içinde tanımlıysa size  o tipte bir nesne olarak döner. Böylelikle o nesnenin işlevlerini aynı değişken ve metot isimlerini kullanarak çağırabilirsiniz. Factory Method Deseninin birbirine çok benzeyen birkaç farklı uygulaması karşınıza çıkabilir. Bir tanesini anladıktan sonra diğer uygulamaları da rahatlıkla çözebilirsiniz. Aşağıda örnek bir uygulama anlatılmıştır. Uygulama basitçe farklı renk hediye kutularına farklı sayıda bilyeler koyup paketlemek gibi önemli bir işi yapmaktadır. Özellikle de yılbaşının yaklaştığı şu günlerde.


Önce ara yüzümüzü oluşturuyoruz. Burada oluşturacağımız nesnenin işlevlerini belirliyoruz. Her nesnenin addMarble isimli bir metodu olsun ve integer tipinde bir değer alıp işlesin istiyoruz. Ama bu işlemin ne olacağı bu ara yüzü(interface) miras alan sınıflarda belirlensin. Yani her mirasçı sınıf bunu kendine göre aynı isimli bir metot altında işlesin.


public interface IGiftBoxFactory

{

    void addMarble(int marbleCount);

}

Şimdi bu sınıfı miras alacak olan sınıfları yazıyoruz. Yazdığımız sınıflara arayüzün metodunu implemente etmemiz bir zorunluluktur.


public class Blue:IGiftBoxFactory

    {

        public void addMarble(int marbleCount){

            Console.WriteLine("{0} adet bilyeli mavi hediye kutusu paketlendi",marbleCount);

        }

    }

public class Red:IGiftBoxFactory

    {

        public void addMarble(int marbleCount){

            Console.WriteLine("{0} adet bilyeli kırmızı hediye kutusu paketlendi",marbleCount);

        }

    }


Gördüğünüz gibi her sınıf aynı addMarble metodunu kendi içinde ayrı bir şekilde işledi. Şimdi bu nesneleri oluşturacak olan fabrika sınıfını oluşturacağız. Ana programda bu sınıftan oluşturcağımız tek bir nesne üzerinden diğer nesnelerin oluşturulmasını sağlayacağız. 


 public class ConcreteGiftBoxFactory 

    {

        public  IGiftBoxFactory GetBox(string Box)

        {

            switch(Box)

            {

                case "Blue":

                    return new Blue();

                    

                case "Red":

                    return new Red();

                    

                default:

                throw new ApplicationException(string.Format(" '{0}' renkli kutumuz yok", Box));

            }

        }

}

Bu sınıf içindeki GetBox metodu aldığı parametreye bir nesne oluşturur. Eğer parametreyle uyumlu bir class yok ise belirlenen hata uyarısını döndürür.


Şimdi ana program classımızı yazalım


class Program

    {

        static void Main(string[] args){

            ConcreteGiftBoxFactory boxFactory = new ConcreteGiftBoxFactory();

            IGiftBoxFactory maviBilyeli = boxFactory.GetBox("Blue");

            maviBilyeli.addMarble(100);


            IGiftBoxFactory kirmiziBilyeli = boxFactory.GetBox("Red");

            kirmiziBilyeli.addMarble(200);


            Console.ReadKey();

        }

}


Burada fabrika classımız cinsinden boxFactory isimli bir nesne oluşturuldu. Sonra IGiftBoxFactory ara yüzünden birer yerel değişken oluşturup bu değişkenlere değer olarak boxFactory nesnesin GetBox metodu ile oluşturduğu nesneyi atıyoruz. Bu sayede nesneye dönüştürdüğümüz yerel değişkenlerde addMarble metodunu kullanarak işlemler yaptırabiliyoruz. Aslında IGiftBoxFactory ara yüzünden değişken üretmek zorunda değiliz. Çünkü fabrika sınıfımızdaki GetBox metodu zaten IGiftBoxFactory türünden miras alan nesneler döndürdüğü için oluşturulan nesnelerin addMarble metoduna erişimi var. Zaten tüm bu yapının amacı addMarble metodunu kullanan ama farklı işlemler yapabilen nesneler döndürmek olduğu için boxFactory nesnesi işimizi görüyor. Buna göre yukarıdaki kod şu şekilde de yazılabilir.


class Program

    {

        static void Main(string[] args){

            ConcreteGiftBoxFactory boxFactory = new ConcreteGiftBoxFactory();

            boxFactory

            .GetBox("Blue")

            .addMarble(100);


            boxFactory

            .GetBox("Red")

            .addMarble(200);

            Console.ReadKey();

        }

}


Aynı sonucu verecektir. Eğer ürettiğimiz nesneler başka yerlerde de kullanılacaksa ilk yöntemi tercih etmemiz daha doğrudur. 

Yorumlar

Bu blogdaki popüler yayınlar

Javascript ile veriyi bir alt satıra nasıl yazdırabiliriz?

JQuery Toggle Açılır Kapanır Menü

C# Field Nedir?