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