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:
-
Builder Pattern nedir ve nerede kullanılır?
-
Kurulum ve temel örnek (Director, Builder, ConcreteBuilder, Product)
-
Parametreli ve generic senaryolar
-
Katmanlı mimaride Builder kullanımı
-
İleri seviye ipuçları

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) |

5. İleri Seviye İpuçları
-
Fluent Builder: Zincirlenebilir arayüzler için metotları
return thisyapın. -
Immutable Builder:
Build()sonunda immutableProductdöndürün. -
Asenkron Yapı: Eğer parçalar I/O operasyonu içeriyorsa
async Taskdestekleyin. -
Test Senaryoları: Her
ConcreteBuilderiçin birim test yazarakGetResult()kontrolü yapın.
Dahili Bağlantılar
-
Karmaşık nesne dönüşümleri için Factory Pattern ile kombinasyon.
-
Nesne yaşam döngüsü yönetimi için Singleton Pattern sayfasına bakın.
İ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.