Sobes.tech
Middle
125
questionbank

Что такое паттерн проектирования 'Строитель'?

Answer from AI

sobes.tech AI

Паттерн "Строитель" (Builder) — это порождающий паттерн, который позволяет пошагово создавать сложные объекты, отделяя процесс конструирования от его представления.

Основные компоненты:

  • Builder: Интерфейс или абстрактный класс, определяющий шаги для построения частей сложного объекта.
  • ConcreteBuilders: Конкретные реализации Builder, которые реализуют шаги построения и создают специфические части продукта.
  • Director: Класс, управляющий последовательностью шагов построения, используя объект Builder. Не знает деталей конкретного Builder'а.
  • Product: Сложный объект, который строится. Состоит из множества частей.

Преимущества:

  • Позволяет менять внутреннее представление продукта без изменения клиента, использующего Builder.
  • Инкапсулирует процесс построения, делая его более понятным.
  • Можно использовать один и тот же Director для построения разных ConcreteBuilders, получая разные Product'ы.
  • Подходит для создания объектов с большим количеством необязательных параметров.

Пример:

// Интерфейс Builder
public interface ICarBuilder
{
    void BuildEngine();
    void BuildSeats();
    void BuildDoors();
    Car GetResult();
}

// Конкретный Builder
public class SportCarBuilder : ICarBuilder
{
    private Car car = new Car();

    public void BuildEngine()
    {
        car.Engine = "Sport Engine";
    }

    public void BuildSeats()
    {
        car.Seats = 2;
    }

    public void BuildDoors()
    {
        car.Doors = 2;
    }

    public Car GetResult()
    {
        return car;
    }
}

// Продукт
public class Car
{
    public string Engine { get; set; }
    public int Seats { get; set; }
    public int Doors { get; set; }

    public void Display()
    {
        Console.WriteLine($"Car with Engine: {Engine}, Seats: {Seats}, Doors: {Doors}");
    }
}

// Директор (необязательно, но часто используется)
public class CarDirector
{
    public void Construct(ICarBuilder builder)
    {
        builder.BuildEngine();
        builder.BuildSeats();
        builder.BuildDoors();
    }
}

// Пример использования
// var builder = new SportCarBuilder();
// var director = new CarDirector();
// director.Construct(builder);
// var sportCar = builder.GetResult();
// sportCar.Display();