C# Facade Design Pattern(Facade Tasarım Deseni)

Merhaba,

Bu makalemizde Structural Patterns(Yapısal Desenler) kategorisine giren Facade Design Pattern hakkında teferruatlı bir içerik oluşturacağız.

‘Facade’, kelime anlamı olarak ‘cephe’ diye nitelendirebileceğimiz aslen Fransızca kökenli bir kelimedir. Tasarım açısından, önemli olan cepheyi işaret eden bu şablon terimi bir binanın dış cephesi olarakta anlamlandırılabilir.

Mimarisel açıdan ise, karmaşık ve detaylı bir sistemi organize eden ve bir bütün olarak clientlara(istemcilere) sunan yapıdır. Anlayacağınız, karmaşık ve detaylı olarak nitelendirdiğimiz bu sistemi bir alt sistem olarak varsayarsak eğer bu sistemi kullanacak clientlara daha basit bir arayüz sağlamak ve alt sistemleri bu arayüze organize bir şekilde dahil etmek ve bu alt sistemlerin sağlıklı çalışabilmesi için bu arayüz çatısı altında işin algoritmasına uygun işlev sergilemek istersek Facade Design Pattern’i kullanmaktayız.

Facade Design Pattern’i kısaca, çoklu kütüphane kodlarına(alt sistemlere) ulaşım için tasarladığımız arayüz olarak nitelendirebiliriz.

C# Facade Design Pattern(Facade Tasarım Deseni)
Yukarıdaki UML Diyagramı Facade Design Pattern’i net bir şekilde açıklamaktadır. Dikkat ederseniz eğer birden fazla Client Facade arayüzümüzü kullanarak alt sistem olarak nitelendirilen sınıflara erişmekte ve organize bir şekilde kullanabilmektedir.

Burada bilmeniz gereken durum, alt sistem içerisinde bulunan sınıfların birbirlerinden bağımsız olmasıdır. Ayriyetten Facade sınıfından da bağımsız bir şekilde çalışabilmektedirler. Clientlar isterse alt sistem sınıflarına direkt erişim sağlayarak çalışmalarını gerçekleştirebilirler. Tabi eğer ki Facade Design Pattern uyguluyorsanız alt sistemdeki memberların erişimlerini private olarak tanımlayıp, Facade sınıfı üzerinden erişimlerini sağlayabilirsiniz. Bu sizin tercihinize kalmıştır.

Şimdi gelin bir araba fabrikasını senaryolaştırıp, Facade tasarım desenini örneklendirelim.
İlk yapacağımız iş alt sistemlerimizi oluşturmaktır.

Alt sistem 1.

    class IskeletOlusturu
    {
        public int x { get; set; }
        public int y { get; set; }
        public bool z { get; set; }
    }

Alt sistem 2.

    class MotorOlusturucu
    {
        public int x { get; set; }
        public int y { get; set; }
        public bool z { get; set; }
    }

Alt sistem 3.

    class ArabaOlusturucu
    {
        public IskeletOlusturu Iskelet { get; set; }
        public MotorOlusturucu Motor { get; set; }
        public ArabaOlusturucu(IskeletOlusturu Iskelet, MotorOlusturucu Motor)
        {
            this.Iskelet = Iskelet;
            this.Motor = Motor;
        }

        public Araba Olustur(Renkler renk)
        {
            return new Araba(Iskelet, Motor, renk);
        }
    }

Alt sistem 4.

    enum Renkler
    {
        Kırmızı,
        Mavi,
        Mor,
        Yeşil,
        Sarı
    }

Alt sistem 5.

    class Araba
    {
        public Araba(IskeletOlusturu Iskelet, MotorOlusturucu Motor, Renkler Renk)
        {
            Console.WriteLine($"Iskelet x = {Iskelet.x}");
            Console.WriteLine($"Iskelet y = {Iskelet.y}");
            Console.WriteLine($"Iskelet z = {Iskelet.z}");
            Console.WriteLine($"Motor x = {Motor.x}");
            Console.WriteLine($"Motor y = {Motor.y}");
            Console.WriteLine($"Motor z = {Motor.z}");
            Console.WriteLine($"Renk = {Renk}");
        }
    }

Şuana kadar gördüğünüz tüm yapılar alt sistemin bir parçasını teşkil etmektedirler. Eğer Facade D. P.’ni kullanmazsak bu sistemlerin işlevi her lazım olduğunda uzun uzun kodlamak durumunda kalacağız. O yüzden client ile alt sistem arasına sokacağımız Facade sınıfımızı inşa etmek daha makul ve sade bir iş olacaktır.

    class FacadeUretici
    {
        IskeletOlusturu iskelet;
        MotorOlusturucu motor;
        ArabaOlusturucu olustur;

        public FacadeUretici()
        {
            iskelet = new IskeletOlusturu() { x = 3, y = 5, z = true };
            motor = new MotorOlusturucu() { x = 2, y = 4, z = false };
            olustur = new ArabaOlusturucu(iskelet, motor);
        }

        public void ArabaUret()
        {
            Araba uretilenAraba = olustur.Olustur(Renkler.Kırmızı);
        }
    }

Evet, yukarıdaki kod bloğunda gördüğünüz gibi alt sistemde bulunan sınıfları organize bir şekilde çalıştırmakta ve ArabaUret sınıfı aracılığıyla istediğimiz neticeyi elde ettirmektedir. Dikkat ederseniz Facade sınıfımız alt sistemdeki tüm sınıfları temsil etmektedir.

Bunların yanında ayriyetten Facade sınıfını Singleton Design Pattern olarak tasarlamanızı öneririm.

Şimdi Facade D. P.’nin son adımı olarak clientlarımızda ilgili Facade sınıfımızı kullanalım. Tabi burada Client olarak nitelendirdiğimiz yer Program.cs sınıfımız olacaktır.

    class Program
    {
        static void Main(string[] args)
        {
            FacadeUretici uretici = new FacadeUretici();
            uretici.ArabaUret();

            Console.Read();
        }
    }

Gördüğünüz gibi alt sistemlerde karmaşık ve detaylı olarak nitelendirebileceğimiz işlemleri organize şekilde Facade sınıfında işleyerek, clientta bu basitleştirilmiş arayüzü kullanarak işlemlerimizi sağde bir şekilde gerçekleştirmiş olduk.

İlgili tasarım deseniyle inşa edilen projemizin çıktısıda aşağıdaki gibi olacaktır.
C# Facade Design Pattern(Facade Tasarım Deseni)

Evet, bir Design Pattern makalemizinde sonuna gelmiş bulunmaktayız.

Okuduğunuz için teşekkür ederim…

Sonraki yazılarımda görüşmek üzere…

İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

Copy Protected by Chetan's WP-Copyprotect.