Sobes.tech
Middle
125
questionbank

Что такое паттерн проектирования 'Строитель' и в каких случаях его лучше всего использовать?

Answer from AI

sobes.tech AI

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

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

  • Строитель (Builder): Интерфейс, определяющий операции построения частей объекта.
  • Конкретный Строитель (Concrete Builder): Реализация интерфейса Строителя, которая конструирует и собирает части конечного продукта.
  • Директор (Director): Класс, который использует Строителя для построения объекта. Он определяет порядок вызова строительных шагов.
  • Продукт (Product): Сложный объект, который строится с помощью Строителя.

Лучше всего использовать в случаях:

  • Когда процесс создания сложного объекта должен быть независим от того, из каких частей этот объект состоит и как они собираются.
  • Когда необходимо создавать различные представления одного и того же объекта с помощью одного и того же процесса конструирования.
  • Когда конструктор объекта имеет слишком много параметров.

Пример:

// Интерфейс строителя
public interface ICarBuilder
{
    void BuildEngine();
    void BuildWheels();
    void BuildBody();
    Car GetCar();
}

// Конкретный строитель
public class SportCarBuilder : ICarBuilder
{
    private Car _car = new Car();

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

    public void BuildWheels()
    {
        _car.Wheels = "Sport Wheels";
    }

    public void BuildBody()
    {
        _car.Body = "Sport Body";
    }

    public Car GetCar()
    {
        return _car;
    }
}

// Продукт
public class Car
{
    public string Engine { get; set; }
    public string Wheels { get; set; }
    public string Body { get; set; }

    public void Show()
    {
        Console.WriteLine($"Car built: Engine={Engine}, Wheels={Wheels}, Body={Body}");
    }
}

// Директор
public class Director
{
    private ICarBuilder _builder;

    public Director(ICarBuilder builder)
    {
        _builder = builder;
    }

    public void ConstructSportCar()
    {
        _builder.BuildEngine();
        _builder.BuildWheels();
        _builder.BuildBody();
    }
}

// Клиентский код
public class Client
{
    public static void Main(string[] args)
    {
        ICarBuilder builder = new SportCarBuilder();
        Director director = new Director(builder);

        director.ConstructSportCar();
        Car sportCar = builder.GetCar();
        sportCar.Show();
    }
}