Factory Method Design Pattern (Tasarım Deseni) – C#

Birden fazla sub-class (alt sınıf) sahip olduğunuz bir super-class (üst-sınıf) olduğu senaryolarda girdiye dayalı olarak alt sınıflarımızdan birini döndürmeniz gerektiğinde Factory Method Design Pattern kullanılır.

Factory Method Pattern, nesnelerin nerede yaratılacağı sorununu çözer. Nesnelerin yaratılmalarını soyutlar ve bu işi istemci kodlarından çıkarıp üretici veya factory metotlara havale eder.

Factory method ise nesnelerin yaratılmasından sorumlu bir metottur. Bir interface’de tanımlanır ve alt sınıflarda gerçekleştirilir.

Özetleyecek olursak bu yaratıcı desen, herhangi bir uygulamanın hedeflediği yeniden kullanılabilir, bakımı yapılabilen ve test edilebilen bir mimari oluşturmanıza yardımcı olacaktır. Bu desenin açıklamanın en basit yolu, gerçek hayattaki fabrikalardır. Bir fabrikanın amacı bir ürünü üretmektir. Örneğin telefon üreten bir fabrika düşünün tek bir amacı vardır telefon üretmek ve tüketiciler bu konu ile ilgilenmezler yani telefonun nasıl üretildiği ile ilgilenmezler, tek ilgilendikleri konu telefonu kullanmaktır. Yani bitmiş ürün ile ilgilenirler. Telefon üreten bir fabrikaya sahip olmanın artısı, o fabrikada üretilen telefonların birden fazla müşteri tarafından kullanılmasıdır ve unutmayın müşteri üretimi umursamaz yada bilmez.

Yukarıda ki paragraftan yola çıkarak bu desen ile ilgili şu yargıya ulaşabiliriz nesneyi bekleyen istemci (client) sınıflarımızı yaratımda (creation) kullanılan sınıflarda ayırırız, bu desenin doğasında yani mimarisinde bu vardır. Deseni, bu açıdan incelediğimizde ilk paragrafın ilk cümlesine atıfta bulunabiliriz yani business için daha genişletile bilinir ve esnek bir çözüm sunmaktadır. Örneğin bir e-ticaret uygulaması düşünelim, yeni bir kargo firması tanıtmamız gerektiğini düşünelim, alışveriş sepeti iş mantığının (business) uygulanış ayrıntılarını değiştirmek zorundan kalmadan bunu bu desen aracılığıyla yapabiliriz. Çünkü alışveriş sepetinin yaratılışıyla, kargo firmasının hiçbir alakası yoktur ve hatta tam olarak hangi nakliye sağlayıcısının kullanıldığıyla ilgilenilir. Sadece onaylaymış bitmiş bir sepet işinin siparişini göndermek istiyoruz.

UML Class Diyagramı

Factory Method UML Diyagram

Kullanım Sıklığı: yüksek

Factory Method Prensipleri

Nesne yaratılışı için bir interface oluşturmayı (Creator) ve hangi nesnenin yaratılacağını bu yapıdan türeyen alt sınıfların (ConcreateCreator) karar vermesini sağlar. Böylece kullanıcı hangi süreçlerden geçildiğini bilmeden nesne yaratabilir.

Bu prensibi uygulamak için sınıfın constructor’ı private veya protected erişim belirleyicileri ile gizlenir. Böylece sınıfı kullanacak kişiye doğrudan erişim kapanır.

Ürünü yani nesneyi yartacak olan fabrika metot genellikle farklı bir sınıfın bağımlı yada statik bir metodudur.

C# Factory Design Pattern Uygulama

Bu senaryomuzda soyut bir class üzerinden factory methodu dizayn ederek girdiye göre farklı tiplerde bilgisayarlar üreten bir program yapısı kurgulayacağız.

Super Class Tasarımı: Creator görevi görecek olan class.

Fabrika tasarım modelindeki süper sınıf, bir arayüz, soyut sınıf veya normal bir sınıf olabilir.
Bu örneğimizde bir bilgisayar yaratan bir creator süper class oluşturyoruz.

    public abstract class CreatorComputer
    {
        public abstract string getRAM();
        public abstract string getHDD();
        public abstract string getCPU();

        public override string ToString()
        {
            return "RAM: " + getRAM() + ", HDD: " + getHDD() + ", CPU: " + getCPU();
        }
    }

Süper class (Creator) üzerinden iki adet GamePc ve DeveloperPc adlarında alt sınıflar üretiyoruz.

    public class ConcreateCreatorDeveloperPC : CreatorComputer
    {
        private string ram;
        private string hdd;
        private string cpu;
        public ConcreateCreatorDeveloperPC(string ram, string hdd, string cpu)
        {
            this.ram = ram;
            this.hdd = hdd;
            this.cpu = cpu;
        }

        public override string getCPU()
        {
            return cpu;
        }

        public override string getHDD()
        {
            return hdd;
        }

        public override string getRAM()
        {
            return ram;
        }
    }

    public class ConcreateCreatorGamePC : CreatorComputer
    {
        private string ram;
        private string hdd;
        private string cpu;
        public ConcreateCreatorGamePC(string ram, string hdd, string cpu)
        {
            this.ram = ram;
            this.hdd = hdd;
            this.cpu = cpu;
        }

        public override string getCPU()
        {
            return cpu;
        }

        public override string getHDD()
        {
            return hdd;
        }

        public override string getRAM()
        {
            return ram;
        }
    }

Artık base sınıflarımız ve alt sınıflarımız hazır olduğuna göre fabrika sınıfımızı yazabiliriz.

    public class FactoryComputer
    {
        public static CreatorComputer FactoryMethod(string type, string ram, string hdd, string cpu)
        {

            if (type == "gamePC")
            {
                return new ConcreateCreatorGamePC(ram, hdd, cpu);
            }
            else if (type == "developerPC")
            {
                return new ConcreateCreatorDeveloperPC(ram, hdd, cpu);
            }
            else
            {
                return null;
            }
        }
    }

Factory Design Pattern metodu ile ilgili bazı önemli noktalar;

  • Factory class Singleton’ı tutabiliriz veya alt sınıfı statik olarak döndüren metot tutabiliriz.
  • Girdi parametresine bağlı olarak farklı alt sınıfların oluşturulduğuna ve döndürüldüğüne dikkat edin.

Program.cs – Main Method

CreatorComputer gamePC = FactoryComputer.FactoryMethod("gamePC", "16 GB", "500 GB", "2.4 GHz");
CreatorComputer developerPC = FactoryComputer.FactoryMethod("developerPC", "32 GB", "1000 TB", "2.4 GHz");

Console.WriteLine("Game PC:\n" + gamePC.ToString());
Console.WriteLine("Developer PC:\n" + developerPC.ToString());

Sonuç

Game PC:
RAM: 16 GB, HDD: 500 GB, CPU: 2.4 GHz
Developer PC:
RAM: 32 GB, HDD: 1000 TB, CPU: 2.4 GHz