Middle
Šta je obrazac dizajna 'Graditelj' (Builder)?
sobes.tech АИ
Одговор од АИ
Модел "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 + "]";
}
}
// Интерфејс за изградњу
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);
}
}