Middle
Какво е патърнът за проектиране 'Builder' (Изградител)?
sobes.tech AI
Отговор от AI
Моделът "Builder" (Изградител) е създаващ шаблон за дизайн, който позволява стъпка по стъпка създаване на сложни обекти, предоставяйки различни варианти за конфигурация.
- Назначение: Да отдели процеса на конструиране на обекта от неговото представяне. Позволява получаването на различни представяния на един и същи процес на конструиране.
- Предимства:
- Позволява стъпково изграждане на обект, скривайки детайлите на конструирането.
- Улеснява създаването на обекти с голям брой опционални параметри (в противоположност на конструкторите с множество аргументи или анти-шаблона Telescoping Constructors).
- Може да използва един и същ код за създаване на различни представяния на обекта.
- Основни участници:
- Builder (Изградител): Интерфейс или абстрактен клас, който определя стъпките за изграждане на частите на обекта.
- ConcreteBuilder (Конкретен изградител): Реализация на интерфейса Builder, която създава конкретните части на обекта и предоставя метод за получаване на крайния резултат.
- Director (Директор): Определя последователността от стъпки за създаване на обекта, използвайки обекта Builder. Директорът е опционален и клиентът може да работи директно с Изградителя.
- Product (Продукт): Обектът, който се изгражда.
Пример за структура (Java):
// Продукт
class Car {
private String engine;
private int wheels;
private String color;
public void setEngine(String engine) {
this.engine = engine;
}
public void setWheels(int wheels) {
this.wheels = wheels;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return "Car [engine=" + engine + ", wheels=" + wheels + ", color=" + color + "]";
}
}
// Интерфейс Builder
interface CarBuilder {
void buildEngine();
void buildWheels();
void buildColor();
Car getResult();
}
// Конкретен изградител
class SportsCarBuilder implements CarBuilder {
private Car car = new Car();
@Override
public void buildEngine() {
car.setEngine("V8");
}
@Override
public void buildWheels() {
car.setWheels(4);
}
@Override
public void buildColor() {
car.setColor("Red");
}
@Override
public Car getResult() {
return car;
}
}
// Директор (по избор)
class CarDirector {
private CarBuilder builder;
public CarDirector(CarBuilder builder) {
this.builder = builder;
}
public void constructCar() {
builder.buildEngine();
builder.buildWheels();
builder.buildColor();
}
}
// Клиентско използване
public class Client {
public static void main(String[] args) {
CarBuilder sportsCarBuilder = new SportsCarBuilder();
CarDirector director = new CarDirector(sportsCarBuilder);
director.constructCar();
Car sportsCar = sportsCarBuilder.getResult();
System.out.println("Изградена кола: " + sportsCar);
// Директна употреба без Директор
CarBuilder anotherSportsCarBuilder = new SportsCarBuilder();
anotherSportsCarBuilder.buildEngine();
anotherSportsCarBuilder.buildColor(); // Без колела
Car partialCar = anotherSportsCarBuilder.getResult();
System.out.println("Частично изградена кола: " + partialCar);
}
}