4.BUİLDER DESİGN PATTERN ?

“Builder”, adım adım bir yaklaşım kullanarak basit nesnelerden karmaşık bir nesne oluşturmak için kullanılan bir creational design pattern’idir.

  • Kelime anlamı “oluşturucu” demektir. İsminden de anlaşıldığı gibi ortaya bir nesne oluşturmayı hedefler.

  • Tanımda da söylediğim gibi yaklaşım olarak nesnenin adım adım oluşturup işlenmesiyle ortaya çıkar.

> AMAÇ: Karmaşık bir nesnenin yapımını temsilinden ayırmaktır. yani ard arda işlemler sonucu bir nesne çıkartmaktır.

  • Neden kullanmalıyım? Kısaca kod kalabalığından kurtarmak için kullandığımız bir tasarım desenidir. Çalışma zamanına ve performansa aman aman bir etkisi yoktur :)

Fakat geliştirme esnasında büyük projelerin geliştirilmesinde ve testinin yapılmasında kullandığınızı varsayarsanız , kod açısından geliştirdiğimiz 15bin satırı 12bine indirir.

  • Diğer creational desenlerden farkı: Builder , ürünlerin ortak bir arayüze sahip olmasını gerektirmez. Böyle bir kısıtlama içerisine bizi sokmuyor. Buda aynı yapım sürecini kullanarak birden fazla farklı ürünler üretmemizi sağlar.

  • Önceki creational tasarım kalıplarında anlattığım bisiklet üzerinden örnek verirsem: Bir bisikletimiz olsun istiyoruz ve bunun Dağ, yarış veya gezi bisikleti olduğunu seçebiliyorduk. Fakat bir dağ bisikleti sipariş verirken size özel özellikleri olan ve birde daha dayanıklı bir dağ bisikleti üretilmesini istiyorsanız gezi bisikleti size uygun olmaz. Bu durumda özel üretim yapan bir üretici bulmanız ve ona istediğiniz özellikleri belirtmeniz gerekir. Çünkü istenilen özelliklerde kadrosunun çelik olması rengi markası ayrıca ek özellikler ile daha spesifik bir üretim oluşacaktır. İşte burada devreye builder design patternı yardımımıza koşuyor diyebilirim. Builder oluşturduğumuz nesnelerin instancelarını özelleştirmek istediğimizde kullanabiliriz.

  • Karmaşık bir nesnenin yapımını basitleştirmek gerektiği durumlarda kullanılır.

  • Katmanlarda kodları belli döngülerle yazmak yerine, ilgili üreticiye tak çıkar özelliği ile enjekte edilmesi ve ona göre başka bir nesnenin ortaya çıkması olarakta kullanılır.

> 📊 Çizdiğim UML diyagramı şu şekilde : BUİLDERDesignPattern

> Yazdığım Kod üzerinden bakarsak :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BuilderDesingPattern
{
public class MainApp
{
public static void Main()
{
BisikletBuilder uret;
// BisikletBuilder ile bayi oluşturuldu
Bayi bayi = new Bayi();
// bisiklet türlerinin oluşturulup, sergilenmesi
uret = new YarisBuilder();
bayi.Construct(uret);
Console.WriteLine(uret.Bisiklet.basla());
uret = new DagBuilder();
bayi.Construct(uret);
Console.WriteLine(uret.Bisiklet.basla());
uret = new GeziBuilder();
bayi.Construct(uret);
Console.WriteLine(uret.Bisiklet.basla());
Console.ReadKey();
}
}
//Director sınıf
//shop=bayii
class Bayi
{
// Builder karmaşık bir dizi adım kullanıyo
public void Construct(BisikletBuilder bisikletBuilder)
{
bisikletBuilder.BuilKadro();
bisikletBuilder.BuildVites();
bisikletBuilder.BuildMarka();
}
}
//'Builder' abstract classı
abstract class BisikletBuilder
{
protected Bisiklet bisiklet;
// Olşturulan bisikletlerin örneği getirilir
public Bisiklet Bisiklet
{
get { return bisiklet; }
}
// Abstract build methodlarıtüretildi
public abstract void BuilKadro();
public abstract void BuildVites();
public abstract void BuildMarka();
}
/// The 'ConcreteBuilder1' class
class DagBuilder : BisikletBuilder
{
public DagBuilder()
{
bisiklet = new Bisiklet("Dağ bisikleti siparişidir");
}
public override void BuilKadro()
{
bisiklet["kadro"] = "Karbon";
}
public override void BuildVites()
{
bisiklet["vites"] = "28";
}
public override void BuildMarka()
{
bisiklet["marka"] = "SALCANO";
}
}
//'ConcreteBuilder2' sınıf
class YarisBuilder : BisikletBuilder
{
public YarisBuilder()
{
bisiklet = new Bisiklet("Yarış Bisikleti şiparişidir");
}
public override void BuilKadro()
{
bisiklet["kadro"] = "Aliminyum";
}
public override void BuildVites()
{
bisiklet["vites"] = "25";
}
public override void BuildMarka()
{
bisiklet["marka"] = "BIANCHI";
}
}
/// The 'ConcreteBuilder3' class
class GeziBuilder : BisikletBuilder
{
public GeziBuilder()
{
bisiklet = new Bisiklet("Gezi Bisikleti şiparişidir");
}
public override void BuilKadro()
{
bisiklet["kadro"] = "Çelik";
}
public override void BuildVites()
{
bisiklet["vites"] = "21";
}
public override void BuildMarka()
{
bisiklet["marka"] = "SCOTT";
}
}
//'Product' classı
class Bisiklet
{
private string _bisikletTuru;
private Dictionary<string, string> _bisikletOzellik= new Dictionary<string, string>();
// Constructor
public Bisiklet(string bisikletTuru)
{
//sayut bisiklet sınfım ile kalıtım verdiğim
//bisiklet türlerini burdan çağırmak için:
this._bisikletTuru = bisikletTuru;
}
// bisklet özelliklerini sözlükten al
public string this[string index]
{
get { return _bisikletOzellik[index]; }
set { _bisikletOzellik[index] = value; }
}
public string basla()
{
return string.Format ("BİSİKLET TÜRÜ: {0} ," +
"\n - Kadro : {1}" +
"\n - Vites: {2}" +
"\n - Marka: {3}" +
"\n******************************",
_bisikletTuru, _bisikletOzellik["kadro"], _bisikletOzellik["vites"], _bisikletOzellik["marka"]);
}
}
}

Yukarıda yaptırdığım şey kullanıcının verdiği özellikler doğrultusunda istediği tipte bir bisiklet üretim siparişini almasını sağlamak ve bunu göstermektir.. Burada istemcinin bisiklet üretimini gerçekleştiren asıl BisikletBuilder nesne örneğini seçmesi gerekir.

Bu seçim işlemi Bayi sınıfı içerisindeki Constructor metoduna parametre olarak gönderilir.

Daha sonra istemcinin istediği Kadro, Vites ve Marka türüne göre bisiklet üretilerek elde edilmiş olur.

> SONUÇ : Yukarıda ki yazdığım kod bloğumu çalıştırdığımda ise şu çıktıyı alarak sizlerle paylaşıyorum :

BUİLDERDesignPattern

> 📌Avantaj :

  • Bir nesnenin yapımı ve örneği arasında açık bir ayrım sağlar.

  • Yapım süreci üzerinde aldığımız sipariş ile iyi kontrol sağlar.

  • Nesnelerin iç yapısını değiştirmeyi destekler.

  • Single Responsibility prensibini destekler.

> 📌Dezavantaj :

  • Kod karmaşıklığı artabilir.

Bu yazım, https://medium.com/@sumeyyekilic/ ‘ da 12 Temmuz 2020 tarihinde medium sayfamda yayınlanmıştır.

❤ Yazımı buraya kadar okuduğunuz için sevgiler❤