Design Patterns (Tasarım Kalıpları)

Kerem Demirtürk
4 min readJul 30, 2020

Merhaba arkadaşlar, bu yazımda java ile design patterns konusuna anladığım kadarıyla giriş yapacağım. Örnek kodlarımı yazının en sonunda vereceğim github adresimden bulabilirsiniz.

Öncelikle Design Pattern nedir dersek, OOP (Object Oriented Programming) ile tam olarak hayatımıza girmiş bir konu diyebiliriz. Tabii biraz daha detaylandırmak gerekirse UML ile soyut olarak düşündüğümüz nesneleri görsel olarak gösterebiliyoruz ve bunları aslında sürekli yapa yapa aynı örüntüleri ya da belli düzenleri tekrar ettiğimizin farkına varıyoruz. Temel olarak design patternler bu şekilde ortaya çıkmıştır diyebiliriz. (örnek mvc)

Design patternler bizim karşımıza yazılımın tasarım aşamasında karşımıza çıkar ve doğru patterni uygulayabilmek için analiz kısmını iyi yapabilmemiz gerekir. Design patternler sorunlarımıza belki direkt olarak çözüm sunmuyor ama modifiyelerle hem sorunlarımızı daha hızlı çözebiliyoruz, hem önümüzü görme konusunda yardım ediyor hem de test kısmında işimize yarıyorlar. Design patternleri 3 ana başlık altında ayırabiliriz ve bunlarıda kısaca özetleyeceğim zaten bunlara uygun patternleri işlerken kafamıza tam olarak oturacaklar.

1- Creational => Nesne üretirken karşılaştığımız sorunlarda kullanılır.

2- Structural => Yapısal, nesneler arası ilişkiler esnasında çıkan sorunlarda kullanılır.

3- Behavioral => Davranışsal, nesnelerin çalışma zamanında davranışlarında değişiklik yaparken getirilen çözümler diyebiliriz.

Şimdi ilk inceleyeceğimiz design pattern Singleton Design patterne gelelim. Nedir sorusuna cevap vermek gerekirse, tekil demektir, ilgili nesneden bir tane oluşsun istersek bu patterni kullanırız. Aşağıda yapacağımız örnektende anlayacağız ama amacımız bir tane nesne oluşturmak ve bu nesneye global erişim noktası oluşturmak. Karşılaşabileceğimiz bir iki sorunu da deneyerek örneğimizi destekleyeceğiz.

Yukarıda new demeden getSingleton methoduyla nesnemizi oluşturduk.Test etmek için bir nesnenin oluşması için kendi constructionuna ihtiyaç duyar ve bu consta giremiyorsa zaten ilgili nesne oluşmaz. Şimdi Consa girince konsola çıktı yazdıracağız böylece kaç çıktımız varsa aslında o kadar nesnemizin olduğunu göreceğiz.

Gördüğümüz gibi her ne kadar 10 kere bu işlemi yapmaya çalışsada sadece bir kere nesnemiz oluşturuldu. Kodları github üzerinden incelerseniz daha net bir şekilde burada yazılanlar kafanıza oturacaktır.

Şimdi Lazy Loading ve Eager Loading konusuna gelmek istiyorum çünkü aşağıda Lazy Loading örneklemesi yapacağız ama önce gelelim bu ikisi ne demek küçük bir özet geçelim.Genellikle entity framework kullananların duyduğu bir şey ama özetlemek gerekirse Lazy Loading, bir ögenin ihtiyaç duyulmadığı sürece çağrılmamasına bağlı olarak çalışır ve çağrılana kadar bir nesne örneğinin bekletilmesi için kullanılır. Eager Loading ise tam tersi bir yapıda işler ilerler, kullancağımız nesneleri, ihtiyacamızın olacağı zamandan önce yaratır ve bekletir. Tabii ki bu kısa bir özetti daha detaylı araştırılması gereken iki başlık. Bu arada nesneye ihtiyaç duymamız demek burada Singleton methodunu çağırmamıza karşılık geliyor. Şimdi bunu deneyelim ve nesneyi çağıralım.

Gördüğümüz gibi tasarım bozuldu. Bu sorunu aşmak için ise tuttuğumuz değişkenin null olup olmadığını kontrol edeceğiz ama multithread çalışmıyorsak, eğer ki çalışıyorsak onun için farklı bir şey daha yapmamız gerekecek.

Değişkeni kontrol edince gördüğünüz gibi sorumuz düzeldi. Şimdi Multithread kısmındaki sorun ne derseniz aynı anda getSingleton methodu çağrılınca ve ikiside null olacağı için iki nesne oluşturulmuş olacak haliyle tasarımımız bozulacak ama bu sorunun çözümü için ise synchronized anahtarını kullanacağız. Ama bu anahtar çalışma süresini arttırabilir bu yüzden de sadece ilk olarak nesne oluştururken bu anahtarı çalıştırırız.

Bu yazımız burada sonlanıyor. Okuduğunuz için teşekkür ederim.

Github : https://github.com/keremdemirtrk/DesignPatterns

Kaynakça :

  • refactoring.guru
  • Sadık Bahadır Memiş
  • Engin Karabudak

--

--