Middle
Czym jest wzorzec projektowy Builder?
sobes.tech AI
Odpowiedź od AI
Wzorzec projektowy Builder służy do tworzenia złożonych obiektów krok po kroku. Oddziela proces konstruowania obiektu od jego reprezentacji, umożliwiając użycie tego samego procesu konstruowania do tworzenia różnych reprezentacji.
Główne komponenty:
- Builder: Interfejs lub klasa abstrakcyjna definiująca metody tworzenia części obiektu.
- ConcreteBuilder: Implementacja interfejsu Builder, która konstruuje i składa części obiektu.
- Director: Określa kolejność wywołań metod ConcreteBuilder w celu stworzenia obiektu. Opcjonalny komponent.
- Product: Złożony obiekt tworzony przy użyciu wzorca Builder.
Zalety:
- Pozwala na krokowe tworzenie złożonych obiektów.
- Zapewnia lepszą kontrolę nad procesem budowania.
- Umożliwia zmianę wewnętrznej reprezentacji obiektu.
- Ułatwia tworzenie różnych wariantów tego samego obiektu.
Przykład:
// Produkt
public class Car
{
public string Engine { get; set; }
public string Color { get; set; }
public int Wheels { get; set; }
public void Display()
{
Console.WriteLine($"Samochód z silnikiem: {Engine}, kolorem: {Color}, kołami: {Wheels}");
}
}
// Builder
public interface ICarBuilder
{
void BuildEngine();
void BuildColor();
void BuildWheels();
Car GetResult();
}
// ConcreteBuilder
public class SportsCarBuilder : ICarBuilder
{
private Car _car = new Car();
public void BuildEngine()
{
_car.Engine = "V8";
}
public void BuildColor()
{
_car.Color = "Czerwony";
}
public void BuildWheels()
{
_car.Wheels = 4;
}
public Car GetResult()
{
return _car;
}
}
// Director
public class CarDirector
{
private ICarBuilder _builder;
public CarDirector(ICarBuilder builder)
{
_builder = builder;
}
public void Construct()
{
_builder.BuildEngine();
_builder.BuildColor();
_builder.BuildWheels();
}
}
// Użycie
public class Program
{
public static void Main(string[] args)
{
ICarBuilder builder = new SportsCarBuilder();
CarDirector director = new CarDirector(builder);
director.Construct();
Car sportsCar = builder.GetResult();
sportsCar.Display();
}
}