Design Pattern 1 – Builder

/*

Yazı serisine birden girmemin bir nedeni vardır. İlerleyen bölümlerde Tasarım desenleri nedir, ne iş yapar, nerelerde kullanılır ve neden ihtiyaç duyulmuştur’u örneklerle anlatacağım bir 4’lük olacaktır. Bilgilerinize.

*/

Herkese Merhaba,

Bu serimizde inşAllah her hafta bir tasarım deseni ve onunla ilgili bilgiler paylaşacağız.

Bu haftaki ilk tasarım desenimiz Builder tasarım deseni. Haydi başlayalım.

Builder, nesne üretim sürecinde değişik parçalar birleştirilip istenilen tipte nesne oluşumunu amaçlamaktadır. eee Yani ? diyorsunuz değil mi ?

Bazen bir nesneyi yaratmak, basit bir yapılandırıcı çağrısından ziyade bir süreç içinde olur. Böyle durumlarda hem nesne karmaşıktır hem de nesneyi yaratma süreci karmaşıktır. Bu türden nesneleri oluşturmak için gerekli süreç Builder kalıbı olarak modellenebilir. 

Bir nesnenin karmaşık olduğunun en temel göstergesi, çok parametre alan kurucularıdır (constructor). Kurucuya geçilen parametrelerin de oluşturulması gerektiği düşünüldüğünde bu sürecin soyutlanması gerektiği açık hale gelir. Factory Method ve Abstract Factory bu problemi çözmez.  Çünkü J. Bloch’un da Effective Java kitabında söylediği gibi bu iki kalıp’ta kurucular gibi büyüme (scale) probemi olan yapılardır.

Builder Design aslında bir oluşturucu (creational) tasarım kalıbıdır.

Amacı çok fazla sayıda constructor’ın yerine daha performanslı olarak kullanılmasıdır.

Öncelikle soruna odaklanalım. Nedir bu sorun ?

Kod üzerinde anlatmak gerekirse.

Mesela yukarda Lab sınıfından 2 farklı constructor’a sahip nesne oluşturduk. Hadi bide baktık ki örneğin sallıyorum bu constructorda farklı bir parametre’ye daha ihtiyaç duyduk. Tekrar Lab sınıfında yeniden constructor yazdık. Her zaman bu yöntem iyi değildir neden mi ?

Şimdi sorunları sıralıyım.

  • Constructor’ın hangi parametresi hangi tip’i alıyor, hangi sırada bilmiyoruz ve yönetmesi zor oluyor.
  • Birden fazla constructor kod kalitesini düşürüyor. Kodun okunmasını zorlaştırıyor.
  • Bizi ya tek constructor’da tüm parametreleri kullanmaya zorluyor ya da yeni constructorlar yazmaya.

Peki bu sorunu nasıl çözeceğiz ? İşte burada builder yapısı devreye giriyor.

Şimdi Gelelim kodumuzu anlatmaya,

Lab sınıfını incelediğimizde şunlarla karşılaşacağız:

  • Final değişken javada içerisine zorunlu bir değişken ataması olan ve değişkenin değerinin değiştirilmediği bir keyword’tur.  Sınıf içerisinde dikkat ettiniz mi final değişkenleri bulunmakta. Hem değişmeyecek olması hemde değer alması ile biz LabBuilder’da zorunlu olmasını istediğimiz alanları belirleyebilir, hemde bunu Lab nesnesinde rahatlıkla kullanabilmekteyiz.
  • Lab sınıfında sadece get işlemlerimizi yapıyoruz. Set işlemleri ise LabBuilder içinde.
  • LabBuilder’ın Constructor’ı 3 parametreyi alıyor ve bunu Lab nesnesine zorunlu kılıyor. Yani Biz Lab nesnesi oluştururken LabBuilder’daki 3 değişkeni zorunlu olarak kullanacağız.

Projeye erişmek için: 

https://github.com/umiitkose/DesignPattern/tree/master/BuilderDesign

 

Kaynakça :

https://sourcemaking.com/design_patterns/builder/java/2

https://www.tutorialspoint.com/design_pattern/builder_pattern.htm

http://blog.asosyalbebe.com/2017/05/builder-pattern-temiz-kod-yazmak.html –> Bence bu konuda en detaylı kaynak. Ellerinize sağlık

https://blog.jayway.com/2012/02/07/builder-pattern-with-a-twist/ –> Örneği Çok İyidir.

https://www.journaldev.com/1425/builder-design-pattern-in-java

http://ilkaygunel.com/blog/2017/builder-design-pattern-in-java/

https://sourcemaking.com/design_patterns/builder/java/2

 

Geniş çaplı kaynakça ve araştırma için:

https://www.utdallas.edu/~chung/SP/applying-uml-and-patterns.pdf

Head First Design Pattern –> Kitap

http://www.vincehuston.org/dp/

https://sourcemaking.com/design_patterns

http://www.javacamp.org/designPattern/

Post Author: umiitkose

Bir Cevap Yazın

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

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">