Builder Tasarım Kalıbı (Builder Design Pattern)

Duygu Demirbaş
Kodcular
Published in
2 min readJun 21, 2019

Builder tasarım kalıbına geçmeden önce tasarım kalıpları nedir ve kullanmanın bize kazandıracakları hakkındaki aşağıdaki yazıyı okuyabilirsiniz :

Builder Tasarım Kalıbı Ne Zaman Kullanılır?

Eğer yazdığınız kod zamanla aşağıdaki gibi bir hal alıyor ise durup düşünmekte, builder tasarım kalıbını burada kullanmalı mıyız diye sorgulamakta fayda olabilir.

Problem 1 : Çok fazla parametre alan objeniz varsa

Eğer çok fazla parametre alan bir objeniz var ise bu objeyi oluştururken constructor’ında bir çok “null” parametre geçmeye başladıysanız.

Constructor’ında çok fazla parametre alan bir nesne

Problem 2 : Farklı parametre kombinasyonlarına sahip birden çok constructorınız varsa

Eğer objenizi oluştururken birden çok constructor’ı varsa ve hangisini kullanacağınız konusu net değilse, bu objeyi oluşturmak için minimum hangi alanları doldurmanız gerektiği konusunda kafa karışıklığınız oluşuyorsa.

Aşağıdaki gibi Pizza class’ınızı oluşturup, pizzanın içindeki elemanlar kadar constructor yazmaya başladıysanız.

Farklı parametrelere sahip birden çok constructor içeren nesne

Problem 3 : Nesnenin oluşturulduktan sonra değişmez (immutable) olmasını istiyorsanız

Aşağıdaki satırlarda pizza nesnesi oluşturulup sonrasında objeye ait özellikler değiştiriliyor. Bu aşamada 2. ve 3. satırlar yazılmasa boyutu ve içeriği olmayan bir pizza nesnesi oluşturulmuş oluyor ki bu aslında tasarladığımız pizza nesnesinin doğasına aykırı.

Üstelik 4. satırdaki firinaGonder() metodu çalıştıktan sonra bile boyutu değiştirilebiliyor. En kötüsü de objenin değiştirildiğinden haberiniz olmuyor.

Eğer bir objeyi yaratırken bu objenin minimum parametre setiniz ile yaratılmasını ve bu alanların yaratıldığı andaki gibi kalmasını istiyorsanız Builder tasarım kalıbını kullanabilirsiniz.

Yukarıdaki Pizza örneğinde pizza ismi ve boyutunun zorunlu alanlar olduğunu var sayarsak ve sonradan değiştirilmemesini garanti altına almak istiyorsak aşağıdaki gibi implemente edebiliriz.

Peki Builder Tasarım Kalıbını Kullanırken Neler Yaptık ?

  • Pizza class’ımızın constructor’ını private yaparak dışarıdan bu nesnenin çağrılmamasını garanti altına aldık.
  • Bir builder class’ı oluşturup (PizzaBuilder) bu class’ın constructorında zorunlu alanlar olan (final olarak tanımlı) “size” ve “name” alanlarını parametre olarak aldık. Böylece bu iki parametre verilmeden yeni bir obje oluşturulamıyor.
  • Opsiyonel olan alanlar için teker teker opsiyonel parametreleri dolduran withOptionalCheese() gibi metodlar yazdık.
  • En son olarak buildPizza() metodunu hazırladık ve builder classından dışarıya Pizza objesini dönmesini sağladık.

Yukarıdaki düzenlemeleri yaptıktan sonra Pizza objesini aşağıdaki gibi oluşturabiliriz.

  • 4. satırda builder objesi oluşturulurken zorunlu alanlar set edilerek oluşturulmak zorunda.
  • 5. ve 6. satırda opsiyonel olan parametreler oluşturuluyor.
  • 7. satırda ise hazırlanan builder objesi üzerinden yeni bir Pizza nesnesi üretiliyor.

Böylelikle;

  • runtime da hiçbir zaman Pizza myFavoritePizza = new Pizza(); gibi zorunlu alanları doldurulmadan yeni bir obje yaratılamıyor.
  • Obje yaratılırken gereksiz ya da null parametreler geçilerek yaratılamıyor. Pizza myFavoritePizza = new Pizza(20, true, true, null, null,null,null) ;
  • Obje yaratıldıktan sonra değişmemesi gereken “size” ya da “name” parametreleri dışarıdan değiştirilemiyor.

--

--