Giriş

Bir nesne inşa sürecini adım adım kontrol etmek istediğinizde Builder Pattern devreye girer.
Özellikle karmaşık konstruktor parametreleri, farklı konfigürasyon adımları veya zorunlu/opsiyonel parça ayrımları olan sınıflarda tercih edilir.
Bu yazıda:

  1. Builder Pattern nedir ve nerede kullanılır?

  2. Kurulum ve temel örnek (Director, Builder, ConcreteBuilder, Product)

  3. Parametreli ve generic senaryolar

  4. Katmanlı mimaride Builder kullanımı

  5. İleri seviye ipuçları

builder-pattern-akis-diyagrami
builder-pattern-akis-diyagrami

1. Builder Pattern Temel Kavramları

  • Director: Nesne oluşturma sürecini yönetir.

  • Builder (Arayüz): Adım adım ürün parçalarını tanımlar (BuildPartA, BuildPartB).

  • ConcreteBuilder: Gerçek parçaları oluşturan sınıf, GetResult() ile finalize edilmiş ürünü döner.

  • Product: Oluşan karmaşık nesne.


2. Kurulum ve Basit Örnek

A. Arayüzler ve Sınıflar

// 1. Builder Arayüzü
public interface IBuilder
{
    void BuildPartA();
    void BuildPartB();
    Product GetResult();
}

// 2. ConcreteBuilder
public class ConcreteBuilder : IBuilder
{
    private readonly Product _product = new();
    public void BuildPartA() => _product.Add("Parça A");
    public void BuildPartB() => _product.Add("Parça B");
    public Product GetResult() => _product;
}

// 3. Director
public class Director
{
    public void Construct(IBuilder builder)
    {
        builder.BuildPartA();
        builder.BuildPartB();
    }
}

// 4. Product
public class Product
{
    private readonly List<string> _parts = new();
    public void Add(string part) => _parts.Add(part);
    public override string ToString() => $"Ürün: {string.Join(", ", _parts)}";
}

B. Kullanım

var director = new Director();
var builder = new ConcreteBuilder();

director.Construct(builder);
var product = builder.GetResult();
Console.WriteLine(product); 
// Çıktı: Ürün: Parça A, Parça B

3. Parametreli ve Gelişmiş Senaryolar

A. Parametreli Builder

public class CarBuilder : IBuilder
{
    private readonly Car _car = new();
    public void BuildPartA() => _car.Engine = "V8";
    public void BuildPartB() => _car.Color = "Kırmızı";
    public void SetWheels(int count) => _car.Wheels = count;
    public Car GetResult() => _car;
}

// Kullanım
var carBuilder = new CarBuilder();
var director = new Director();
director.Construct(carBuilder);
carBuilder.SetWheels(4);
var car = carBuilder.GetResult();

B. Generic Builder

public interface IBuilder<T>
{
    void BuildPart(T data);
    T GetResult();
}

4. Katmanlı Mimari Entegrasyonu

Katman Sorumluluk
Domain Product, IBuilder<T> arayüzleri
Application Director sınıfı ve farklı ConcreteBuilder implementasyonları
API/Presentation Builder kullanarak Product nesnesi oluşturma (Controller/Service)
builder-katmanli-mimari-semasi
builder-katmanli-mimari-semasi

5. İleri Seviye İpuçları

  1. Fluent Builder: Zincirlenebilir arayüzler için metotları return this yapın.

  2. Immutable Builder: Build() sonunda immutable Product döndürün.

  3. Asenkron Yapı: Eğer parçalar I/O operasyonu içeriyorsa async Task destekleyin.

  4. Test Senaryoları: Her ConcreteBuilder için birim test yazarak GetResult() kontrolü yapın.


Dahili Bağlantılar


İleri Okuma ve Kaynaklar


6. Sonuç

  • Builder Pattern, karmaşık nesne oluşturmayı adım adım kontrol eder.

  • Director ile yapı adımlarını merkezi olarak yönetir, ConcreteBuilder ile gerçek detayları sağlar.

  • Katmanlı mimaride uygulandığında, iş ve sunum katmanları temiz kalır.

By tanju.bozok

Software Architect, Developer, and Entrepreneur

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir