3 Eylül 2023 Pazar

Factory Method Design Pattern Nedir ?

 

Factory method design pattern nedir ?

Merhabalar, bu yazımızda Factory Method Design Pattern ile ilgili bir örnek proje gerçekleştireceğiz. Bu tasarım kalıbıyla yapılmak istenen amaç, oluşturmak istediğimiz sınıfın kendisinden bir örnek istemek yerine Factory Method Pattern'i sayesinde tek bir instance üzerinden gerekli nesnenin üretilmesini sağlamaktır.

Uygulamamızda belirli adımlarda farklı tiplerde nesnelere ihtiyacımız olabilir. Bu nesneleri if - else veyahut switch yapıları aracılığıyla, duruma göre oluşturabiliriz. Tabi bunu her seferinde yapmanın zaman ve kod açısından çok tasarruflu olduğunu düşünülemez. İşte böyle durumlarda Factory Method Pattern'ini kullanabiliriz.

Bir başka deyişle, elinizin altındaki birden çok ilişkisel sınıftan nesne üreteceksek, söz gelimi her defasında ilgili nesneye özel üretme gramerini uygulamanıza gerek kalmayacak, tek bir sınıf üzerinden oluşturacağımız nesne talebiyle istediğiniz nesneyi elde edebileceğiz.

Şimdilik şöyle bir örnek üzerinden gidelim.Bir galeri düşünelim Bmw, Opel, Mercedes markalarını satıyor. Factory Method Pattern'i ile istediğimiz araba nesnesini üretelim.

Abstract Class İle Factory Method Design Pattern

Kurgulanan senaryoya göre tüm arabalarin türetilecek abstract class’ı dizayn edelim.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
using System;
using System.Collections.Generic;
using System.Text;

namespace FactoryMethodDesign.AbstractClass
{
    /// <summary>
    /// Soyutlanacak base class abstract kelimesi ile belirtilir
    /// </summary>
   abstract class ArabaMarkasi
    {
        /// <summary>
        /// MarkaAdi methodu abstract kelimesi ile işaretlenerek ArabaMarkasi clasından kalıtılan
        /// classta bu method override edilmek zorunda. Oyuzden gövdesi burada doldurulmaz.
        /// </summary>
        public abstract void MarkaAdi();
    }
}

 

Şimdide arabalarımızı tasarlayalım ve oluşturmuş olduğumuz “ ArabaMarkasi ” abstract class’ından bu ürünleri türetelim.

Bmw:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic;
using System.Text;

namespace FactoryMethodDesign.AbstractClass
{
    /// <summary>
    /// Bmw class'ını soyutlanmış ArabaMarkasi class'ından türetiyorum.
    /// Ve ArabaMarkasi class'ındaki abstract olarak tanımlanmış methodu override ederek methodun body'sini dolduruyorum
    /// </summary>
    class Bmw : ArabaMarkasi
    {
        /// <summary>
        /// ArabaMarkasi class'ından iplement'e edilen ve override edilen method
        /// </summary>
        public override void MarkaAdi()
        {
            Console.WriteLine("Bu araba abstarc'tan Oluşturuldu ve Bmw dir.");
        }
    }
}


Mercedes:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic;
using System.Text;

namespace FactoryMethodDesign.AbstractClass
{
    /// <summary>
    /// Mercedes clasını soyutlanmış ArabaMarkasi clasından türetiyorum.
    /// Ve ArabaMarkasi klasındaki abstract olarak tanımlanmış methodu override ederek, methodun body sini dolduruyorum
    /// </summary>
    class Mercedes : ArabaMarkasi
    {
        /// <summary>
        /// ArabaMarkasi clasından iplemente edilen ve override edilen method
        /// </summary>
        public override void MarkaAdi()
        {
            Console.WriteLine("Bu araba Abstarctan Oluşturuldu ve Markası Mercedes tir.");
        }
    }
}

 

Opel:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Text;

namespace FactoryMethodDesign.AbstractClass
{
    /// <summary>
    /// Opel platformunun clasını soyutlanmış ArabaMarkasi clasından türetiyorum.
    /// Ve ArabaMarkasi klasındaki abstract olarak tanımlanmış methodu override ederek, methodun body sini dolduruyorum
    /// </summary>
    class Opel : ArabaMarkasi
    {
        /// <summary>
        /// ArabaMarkasi clasından iplemente edilen ve override edilen method
        /// </summary>
        public override void MarkaAdi()
        {
            Console.WriteLine("Bu araba Abstarctan Oluşturuldu ve Markası Opel dir.");
        }

    }
}

 

Araba ürünlerimi Abstract class olan ArabaMarkasi sınıfından türeterek sınıflarımı oluşturdum. Artık bu sınıflardan nesne üretecek olan Creater sınıfını oluşturalım ve içerisine Factory işlemini yapacak metodumuzu tanımlayalım.

Ama öncelikle bu method hangi tipten nesne üreteceğini nerden bilecek? Bu durumu Enumaration ile halledebiliriz. Aşağıdaki Enumaration FactoryMethod’un hangi tipte nesne üreteceğine yardımcı olacaktır.

Araba Çeşitleri:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
using System;
using System.Collections.Generic;
using System.Text;

namespace FactoryMethodDesign.AbstractClass
{
    enum Markalar
    {
        Bmw,
        Opel,
        Mercedes
    }
}

 

 Bu işlemden sonra FactoryMethod’u tam olarak inşa edebiliriz.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using System.Collections.Generic;
using System.Text;

namespace FactoryMethodDesign.AbstractClass
{
    /// <summary>
    /// Creator clasımız objelerin oluşturulmasından sorumlu obje
    /// </summary>
    class Creator
    {
        /// <summary>
        /// ArabaMarkasi tipinde obje oluşturan factory method 
        /// </summary>
        /// <param name="oyunTipi"></param>
        /// <returns></returns>
        public ArabaMarkasi FactoryMethod(Markalar arabaMarkasi)
        {
            ArabaMarkasi araba = null;
            switch (arabaMarkasi)
            {
                case Markalar.Bmw:
                    araba = new Bmw();
                    break;
                case Markalar.Opel:
                    araba = new Opel();
                    break;
                case Markalar.Mercedes:
                    araba = new Mercedes();
                    break;
                default:
                    break;
            }
            return araba;
        }
    }
}

 

Gördüğünüz gibi FactoryMethod parametresinde belirttiğimiz tipe göre istediğimiz nesneyi oluşturacak bir işleyişe sahip oldu. Burada dikkat etmeniz gereken husus, her bir araba ürününün “ArabaMarkasi” abstract class’ından kalıtım almasından dolayı çok biçimlilik kullanılarak “ArabaMarkasi” referansında tutulabilmekte ve geriye döndürülebilmektedir. Sıra geldi istediğimiz nesneyi üretmeye…

Ekran görüntüsü aşağıdaki gibi oluyor.

 

Tabi ilişkisel sınıflar ve algoritmada ki ihtiyaca göre üretilmesi gereken sınıflar üzerinde bu tasarım desenini uygulamak en doğrusudur.

Eğer Factory Method tasarım desenenini interface kullanarak uygulamak istiyorsanız, “ArabaMarkasi” isimli abstract sınıfını interface’e çevirmeniz yeterlidir. Tabi bu çevrim sırasında interface kurallarını dikkate almalı ve arabalari interfaceden türetirken yapılacak implementte override komutu olmadan uygulama gerçekleştirilmelidir. Bununla ilgili yazıda kod parçaaı koymayacağım ama github taki projede o kodlar mevcut.Umarım faydalı olmuştur iyi çalışmalar.

 Yararlandığım Kaynaklar

Kaynak Kodu 

https://www.gencayyildiz.com/blog/c-factory-method-design-patternfactory-method-tasarim-deseni/ 

http://www.canertosuner.com/post/factory-method-pattern-nedir-nasil-kullanilir 

Hiç yorum yok:

Yorum Gönder

.Net Core'da Swagger UI Kullanımı

  Web API geliştirirken API de yazılan metodların ne iş yaptığı? Hangi parametreleri aldığı? Ne cevap döndüğü? Gibi bilgilerin yer aldığı ...