Builder Pattern Nedir?

Can Yüksel

Erdoğancan Yüksel

2 dakika 42 saniye okuma süresi

Builder Pattern, yazılım geliştirme süreçlerinde karmaşık nesnelerin oluşturulması sürecini basitleştirerek bir nesnenin oluşturulmasını ve yapılandırılmasını adım adım yönetmeyi sağlayan ve kodun okunabilirliğini kolaylaştıran tasarım desenidir.

builder-pattern-nedir

Builder pattern, nesneleri adım adım oluşturmamızı sağlayan yaratıcı (creational) tasarım desenlerinden birisidir. Çok sayıda parametreye sahip nesne oluşturma ihtiyacı duyulduğunda constructor (yapıcı metot) içerisinde fazla sayıda parametre ile uğraşarak karışıklığı arttırmak yerine adım adım nesne oluşturmak tercih edildiğinde kullanılmaktadır.

Builder pattern'ın kullanım amaçları şu şekilde sıralanabilir:

  • Nesne oluşturma sürecini adım adım ilerleterek kodun daha anlaşılabilir ve okunabilir olmasını sağlar.
  • Nesne oluştururken parçalarını farklı sırayla oluşturabilme imkanı ile esneklik sağlar.
  • Yeni özelliklerin eklenmesi gereken durumlarda temel nesneyi değiştirmeden builder güncellenerek ekleme yapılabilir.
  • Birçok parametre içeren constructor (Teleskopik Constructor) yapısının oluşturduğu karmaşıklığı azaltır.

Builder pattern kullanımının avantajları ve dezavantajları şu şekilde sıralanabilir:

Avantajları:
  • Constructor build aşamasında parametrelerin kontrolü yapılabilir.
  • Bir kez oluşturulan nesne değiştirilemez.
  • Farklı nesneler için ortak builder aşamaları kullanılabilir. Bu şekilde kod tekrarı önlenmiş olur.
Dezavantajı:
  • Adım adım nesne oluşturma işlemi basit nesneler için gereksiz karmaşıklık yaratabilir ve ekstra kod yazılmasını gerektirir. Bu nedenle nesne oluşturma süreci karmaşık ise uygulanmalıdır.

C# ile Builder Pattern Uygulaması

Builder Pattern uygulaması için kod örneği:

// Product sınıfı - Car
public class Car
{
    public string Brand { get; set; }
    public string Color { get; set; }
    public CarType CarType { get; set; }
    public TransmissionType TransmissionType { get; set; }
    public EngineType EngineType { get; set; }

    public override string ToString()
    {
        return $"Car features: \n" +
            $"Brand Name: {Brand}\n" +
            $"Color: {Color}\n" +
            $"Car Type: {Enum.GetName(typeof(CarType), CarType)}\n" +
            $"Transmission Type: {Enum.GetName(typeof(TransmissionType), TransmissionType)}\n" +
            $"Engine Type: {Enum.GetName(typeof(EngineType), EngineType)}\n";
    }
}

// Enum tanımlamaları
public enum CarType
{
    Sedan,
    Hatchback,
    Coupe,
    SUV,
    Jeep,
    StationWagon
}

public enum TransmissionType
{
    Automatic,
    Manual
}

public enum EngineType
{
    Diesel,
    Gasoline,
    Electric
}

// Builder arayüzü
public interface ICarBuilder
{
    ICarBuilder SetBrand(string brand);
    ICarBuilder SetColor(string color);
    ICarBuilder SetCarType(CarType type);
    ICarBuilder SetTransmissionType(TransmissionType type);
    ICarBuilder SetEngineType(EngineType type);
    Car Build();
}

// ConcreteBuilder sınıfı - CarBuilder
public class CarBuilder : ICarBuilder
{
    private Car _car;
    public CarBuilder()
    {
        _car = new Car();
    }
    public ICarBuilder SetBrand(string brand)
    {
        _car.Brand = brand;
        return this;
    }
    public ICarBuilder SetColor(string color)
    {
        _car.Color = color;
        return this;
    }
    public ICarBuilder SetCarType(CarType type)
    {
        _car.CarType = type;
        return this;
    }

    public ICarBuilder SetEngineType(EngineType type)
    {
        _car.EngineType = type;
        return this;
    }
    public ICarBuilder SetTransmissionType(TransmissionType type)
    {
        _car.TransmissionType = type;
        return this;
    }

    public Car Build()
    {
        return _car;
    }
}

// Director sınıfı - CarDirector
public class CarDirector
{
    private ICarBuilder _carBuilder;
    public CarDirector(ICarBuilder carBuilder)
    {
        _carBuilder = carBuilder;
    }

    public Car CreateDieselManualSedanCar()
    {
        return _carBuilder
            .SetBrand("Volkswagen")
            .SetColor("Blue")
            .SetEngineType(EngineType.Diesel)
            .SetTransmissionType(TransmissionType.Manual)
            .SetCarType(CarType.Sedan)
            .Build();
    }

    public Car CreateGasolineAutomaticHatchbackCar()
    {
        return _carBuilder
          .SetBrand("Mercedes")
          .SetColor("Black")
          .SetEngineType(EngineType.Gasoline)
          .SetTransmissionType(TransmissionType.Automatic)
          .SetCarType(CarType.Hatchback)
          .Build();
    }

    public Car CreateElectricAutomaticJeepCar()
    {
        return _carBuilder
          .SetBrand("Tesla")
          .SetColor("White")
          .SetEngineType(EngineType.Electric)
          .SetTransmissionType(TransmissionType.Automatic)
          .SetCarType(CarType.Jeep)
          .Build();
    }
}

// Kullanım

var builder = new CarBuilder();
var director = new CarDirector(builder);

var carType1 = director.CreateDieselManualSedanCar();
Console.WriteLine(carType1);
var carType2 = director.CreateGasolineAutomaticHatchbackCar();
Console.WriteLine(carType2);

var carType3 = director.CreateElectricAutomaticJeepCar();
Console.WriteLine(carType3);


//Director sınıfında belirttiğimiz hazır metotların dışında bir metot kullanmak istersek:
var customCarType = builder
            .SetBrand("BMW")
            .SetColor("Red")
            .SetEngineType(EngineType.Gasoline)
            .SetTransmissionType(TransmissionType.Automatic)
            .SetCarType(CarType.Coupe)
            .Build();

Console.WriteLine(customCarType); 
//# Output:
Car features:
Brand Name: Volkswagen
Color: Blue
Car Type: Sedan
Transmission Type: Manual
Engine Type: Diesel

Car features:
Brand Name: Mercedes
Color: Black
Car Type: Hatchback
Transmission Type: Automatic
Engine Type: Gasoline

Car features:
Brand Name: Tesla
Color: White
Car Type: Jeep
Transmission Type: Automatic
Engine Type: Electric

Car features:
Brand Name: BMW
Color: Red
Car Type: Coupe
Transmission Type: Automatic
Engine Type: Gasoline

Yukarıdaki kod bloğunda:

  • Car: Oluşturmak istenilen karmaşık nesneyi ifade eder.
  • ICarBuilder: Car nesnesinin yapılandırılması için ilgili basamak metotlarını içeren arayüzdür.
  • CarBuilder: ICarBuilder arayüzünü uygulayarak Car nesnesini oluşturur.
  • CarDirector: CarBuilder ile Car nesnesinin oluşturulmasını kontrol eder. İstenilen parametreler doğrultusunda farklı nesneler oluşturur. (CreateDieselManualSedanCar, CreateGasolineAutomaticHatchbackCar veya CreateElectricAutomaticJeepCar gibi)

 Sonuç olarak Builder Pattern nesne yönelimli programlama dillerinde nesne oluşturma sürecini sadeleştirerek daha yönetilebilir ve anlaşılır hale getiren güçlü bir tasarım desenidir. Özellikle parametre sayısı fazla ve karmaşık nesneler ile çalışırken kodun daha temiz ve bakımı kolay hale getirilmesini sağlamaktadır.

Benzer İçerikler