Welcome to My Blog 👋

Java, Spring Framework, Microservices, Docker, Kubernetes, AWS and Others 🚀
Follow Me

Design Pattern - Facade



  May 18, 2019    Labels:,,,,,,,, 

Facade Design Pattern'ının temel amacı soyutlama yapmaktır. Nesneye yönelimli programlamanın temellerinden biri soyutlamadır ve nesneye yönelimli programlamada daima kullanılır. Facade patern'ı sistemleri veya katmanları soyutlayarak bunların karmaşıklığını gizler, bir arayüz oluşturur, daha sonra kodların değiştirilebilirliğini sağlar ve doğrudan erişilmemesi gereken alanların kontrollü bir şekilde kullanılmasını sağlar. Örneğin yazılım sistemimizde veritabanı katmanını facade patern'ı ile soyutlayarak kodumuzu veritabanı sisteminden bağımsız yazabiliriz. Bir başka örnek olarak kullanılan kütüphaneler facade patern'ı ile bir arayüz şeklinde kullanıma açılarak o kütüphaneyi kullanacak kullanıcıya kolaylık ve doğru bir yol sağlanabilir. Bu verdiğim örnekler sıkça kullanılan ve genellikle karşınıza çıkacak örneklerdir.
Facade patern'ının en çok karşımıza çıktığı bir başka yer de framework'lerdir. Framework'lerin altında çalışan kütüphanelere veya alt sistemlere genellikle o framework'ün context sınıfı ile erişiriz. Bu context sınıfları genellikle facade patern'ı ile oluşturulur. Android'teki Context sınıfı veya Spring'teki ApplicationContext sınıfı örnek olarak verilebilir.

Uygulama
  • Facade sınıfı kullanacağı alt birimleri kendi içerisinde barındırır.
  • Facade sınıfı genellikle singleton pattern'ı ile tanımlanır.
  • Facade sınıfının alt birimleri factory metotlar ile dışarıya açılabilir.



class Facade {
    
    private AltSistem1 altSistem1;
    private AltSistem2 altSistem2;
    private static Facade facade;
    
    private Facade() {
        altSistem1 = new AltSistem1();
        altSistem2 = new AltSistem2();
    }
    
    public static Facade getFacade() {
        if(facade == null) {
            facade = new Facade();
        }
        return facade;
    }
    
    public void altSistem1IslemleriYap() {
        altSistem1.islem1();
        altSistem1.islem2();
    }
    
    public void altSistem2Islem1Yap() {
        altSistem2.islem1();
    }
}

class AltSistem1 {
    
    public void islem1() {
        System.out.println("Alt Sistem 1 İslem 1 yapıldı");
    }
    
    public void islem2() {
        System.out.println("Alt Sistem 1 İslem 2 yapıldı");
    }
}

class AltSistem2 {
    
    public void islem1() {
        System.out.println("Alt Sistem 2 İslem 1 yapıldı");
    }
}

public class Test {

     public static void main(String []args){
        Facade facade = Facade.getFacade();
        facade.altSistem1IslemleriYap();
        facade.altSistem2Islem1Yap();
     }
}

Alt Sistem 1 İslem 1 yapıldı
Alt Sistem 1 İslem 2 yapıldı
Alt Sistem 2 İslem 1 yapıldı

No comments:

Post a Comment