3 Eylül 2023 Pazar

Abstract Factory Design Pattern Nedir?

 

Abstract factory design pattern nedir?

Merhabalar, bu yazımızda Abstract Factory Design Pattern ile ilgili örnek bir proje gerçekleştireceğiz.Önceki yazımızda Factory Design Method Pattern ile ilgili örnek bir proje yapmıştık. Peki Factory Design Method ile Abstract Factory Design arasındaki fark nedir ? Sorusuna cevap vermeye çalışalım.

Factory Method’ta ilişkisel olan birden fazla nesnenin üretimini ortak bir arayüz aracılığı ile tek bir sınıf üzeriden oluşturur.Nesne üretimi esnasında istemcinin üretilen nesneye olan bağımlılığını ortadan kaldırmayı hedefler.

Abstract Factory ise ilişkisel olan birden fazla nesnenin üretimini tek bir arayüz üzerinden değil de her ürün grubu için farklı bir arayüz tanımlayarak sağlamaktadır.Yani birden fazla ürün grubu ile çalışacaksak bunları istemciden bu yöntemle soyutlayarak nesneler üretilir.

Şimdi örnek projeye başlayalım.Öncelikle interface tanımlarını yapalım. 

 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
38
39
40
41
    /// <summary>
    /// Araba nesnelerimin türetildiği base interface
    /// </summary>
    public interface IAraba
    {
        /// <summary>
        /// Arabanın adını getiren method
        /// </summary>
        /// <returns></returns>
        string GetArabaModeli();
    }

    /// <summary>
    /// Jant Nesnelerimin türetileceği base interface
    /// </summary>
    public interface IJant
    {
        /// <summary>
        /// Jantın çapını getiren method
        /// </summary>
        /// <returns></returns>
        int GetJantCapi();
    }
    
    /// <summary>
    /// Marka oluşturan base interface
    /// </summary>
    public interface IMarkaFactory
    {
        /// <summary>
        /// Araba Nesnesini oluşturan method
        /// </summary>
        /// <returns></returns>
        IAraba ArabaOlustur();

        /// <summary>
        /// Jant nesnesini oluşturan method
        /// </summary>
        /// <returns></returns>
        IJant JantOlustur();
    }

 

 Yine araba markaları üzerinden anlatım yapacağım.Şimdi de arabaların modellerini oluşturuyorum.

 

 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
38
39
40
41
42
43
44
    /// <summary>
    /// BMW nesnesi IAraba interfaceden türettim
    /// </summary>
    public class Bmw : IAraba
    {
        /// <summary>
        /// Araba modelini getirir
        /// </summary>
        /// <returns></returns>
        public string GetArabaModeli()
        {
            return "7.40";
        }
    }
    
    /// <summary>
    /// Mercedes nesnesi IAraba interfaceden türettim
    /// </summary>
    public class Mercedes : IAraba
    {
        /// <summary>
        /// Araba Modelini getirir.
        /// </summary>
        /// <returns></returns>
        public string GetArabaModeli()
        {
            return "CLA 350";
        }
    }
    
    /// <summary>
    /// OPEL nesnesi IAraba interfaceden türettim
    /// </summary>
    public class Opel : IAraba
    {
        /// <summary>
        /// Araba Modelini getirir.
        /// </summary>
        /// <returns></returns>
        public string GetArabaModeli()
        {
            return "Insignia";
        }
    }

 

 Şimdide araba modellerinde bulunacak olan jantları oluşturacağım.

 

 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
38
39
40
41
42
43
44
45
    /// <summary>
    /// Bmw jantının nesnesini Ijant interfaceden türetiyorum
    /// </summary>
    public class BmwJant : IJant
    {
        /// <summary>
        /// Jant çapını getiren method
        /// </summary>
        /// <returns></returns>
        public int GetJantCapi()
        {
            return 19;
        }
    }
    
    /// <summary>
    /// Jant nesnesini Ijant interfaceden türetiyorum
    /// </summary>
    public class MercedesJant : IJant
    {
        /// <summary>
        /// Janbt çapını getiren method
        /// </summary>
        /// <returns></returns>
        public int GetJantCapi()
        {
            return 18;
        }
    }
    
    
    /// <summary>
    /// Opel Jantlarını Ijant interfaceden türetiyorum
    /// </summary>
    public class OpelJant : IJant
    {
        /// <summary>
        ///JAnt çapını getiren method
        /// </summary>
        /// <returns></returns>
        public int GetJantCapi()
        {
           return 17;
        }
    }

 

Şimdide araba nesnesini oluşturacak factory classları yazıyoruz.Bu kısımda IMarkaFactory interface’inde yaptığımız tanımlamalara göre bize araba ve jant nesnesinden oluşan bir marka objesi üretme işlemi gerçekleştireceğiz. Aşağıdaki kodlara bakıldığında daha iyi anlaşılacaktır.

 

 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    /// <summary>
    /// BmwFactory Bmw fabrikası gibi düşünebirlirsiniz.
    /// IMarkaFactory interfaceden Bir tane araba 
    /// ve jant oluşturan methodlarla araba ve jant oluşturuyoruz.
    /// </summary>
    public class BmwFactory : IMarkaFactory
    {
        public IAraba ArabaOlustur()
        {
            return new Bmw();
        }

        public IJant JantOlustur()
        {
            return new BmwJant();
        }
    }
    
    /// <summary>
    /// MercedesFactory Mercedes fabrikası gibi düşünebirlirsiniz.
    /// IMarkaFactory interfaceden Bir tane araba ve jant oluşturan
    /// methodlarla araba ve jant oluşturuyoruz.
    /// </summary>
    public class MercedesFactory : IMarkaFactory
    {
        public IAraba ArabaOlustur()
        {
            return new Mercedes();
        }

        public IJant JantOlustur()
        {
            return new MercedesJant();
        }
    }
    
    
    /// <summary>
    /// OpelFactory Opel fabrikası gibi düşünebirlirsiniz.
    /// IMarkaFactory interfaceden Bir tane araba ve jant
    /// oluşturan methodlarla araba ve jant oluşturuyoruz.
    /// </summary>
    public class OpelFactory : IMarkaFactory
    {
        public IAraba ArabaOlustur()
        {
            return new Opel();
        }

        public IJant JantOlustur()
        {
            return new OpelJant();
        }
    }

İnterface ve class tanımlamalarımız buraya kadardı.Biz şimdi burada ne yaptık ? IAraba ve IJant interface yasesinde istediğimiz kadar farklı jant ve araba tipi üretebiliriz. IMarkaFactory interface’i sayesinde istediğimiz kombinasyonlarda marka üretebiliriz. ImarkaFactory interface’i sayesinde Bmw, Mercedes, Opel markalarını üretebiliyorum.

Ama bu üretim için DunyaMarkalari class’ını kullanıyoruz. İstediğim markanın özelliklerine göre markayı üretip objeyi geri dönüyor bize.

 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
38
39
40
41
42
43
    /// <summary>
    /// Clientların marka,araba ve jant oluşturmak istediklerinde bu objeyi kullanacaklar
    /// </summary>
    public class DunyaMarkalari
    {
        /// <summary>
        /// oluşturulacak arabayı tuttuğumuz değişken
        /// </summary>
        private readonly IAraba _araba;

        /// <summary>
        /// Oluşturulacak jantı tuttuğumuz değişken
        /// </summary>
        private readonly IJant _jant;

        /// <summary>
        /// Nesneye constructor da hangi markayı verirsem o markanın objesini oluşturur.
        /// </summary>
        /// <param name="markaFactory"></param>
        public DunyaMarkalari(IMarkaFactory markaFactory)
        {
            _araba = markaFactory.ArabaOlustur();
            _jant = markaFactory.JantOlustur();
        }

        /// <summary>
        /// Oluşturulan arabanın modelini getirir. 
        /// </summary>
        /// <returns></returns>
        public string ArabaModeli()
        {
            return _araba.GetArabaModeli();
        }

        /// <summary>
        /// Oluşturulan jantın çapını getirir. 
        /// </summary>
        /// <returns></returns>
        public int JantCapi()
        {
            return _jant.GetJantCapi();
        }
    }

 Şimdi örneğimizdeki 3 farklı markayı üretip özelliklerine bakalım.

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
            BmwFactory bmwFactory = new BmwFactory();
            OpelFactory opelFactory = new OpelFactory();
            MercedesFactory mercedesFactory = new MercedesFactory();

            DunyaMarkalari dunyaMarkalari = new DunyaMarkalari(bmwFactory);
            Console.WriteLine(String.Format("Araba Modeli:{0}, Jant Çapı:{1}", dunyaMarkalari.ArabaModeli(), dunyaMarkalari.JantCapi()));

            Console.WriteLine(Environment.NewLine);

            DunyaMarkalari dunyaMarkalari2 = new DunyaMarkalari(opelFactory);
            Console.WriteLine(String.Format("Araba Modeli:{0}, Jant Çapı:{1}", dunyaMarkalari2.ArabaModeli(), dunyaMarkalari2.JantCapi()));

            Console.WriteLine(Environment.NewLine);

            DunyaMarkalari dunyaMarkalari3 = new DunyaMarkalari(mercedesFactory);
            Console.WriteLine(String.Format("Araba Modeli:{0}, Jant Çapı:{1}", dunyaMarkalari3.ArabaModeli(), dunyaMarkalari3.JantCapi()));

 

 


 

 Umarım faydalı olmuştur.Kaynak kodları github’a koydum oradan bakıp inceleyebilirsiniz.Esen kalın.

Yararlandığım Kaynaklar

Kaynak Kodu 

https://medium.com/@hakantopuz/abstract-factory-design-pattern-nedir-ne-zaman-ve-nas%C4%B1l-kullan%C4%B1l%C4%B1r-25dea188477c

https://www.gencayyildiz.com/blog/c-abstract-factory-design-patternabstract-factory-tasarim-deseni/ 

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ığı ...