Middle
O que é o padrão de projeto 'Builder' (Construtor)?
sobes.tech IA
Resposta da IA
O padrão "Builder" (Construtor) é um padrão de design criacional que permite criar objetos complexos passo a passo, fornecendo várias opções de configuração.
- Propósito: Separar o processo de construção de um objeto da sua representação. Permite obter diferentes representações do mesmo processo de construção.
- Vantagens:
- Permite construir um objeto passo a passo, ocultando os detalhes da construção.
- Facilita a criação de objetos com um grande número de parâmetros opcionais (diferente dos construtores com múltiplos argumentos ou do anti-padrão Telescoping Constructors).
- Pode usar o mesmo código de construção para criar diferentes representações do objeto.
- Principais participantes:
- Builder (Construtor): Interface ou classe abstrata que define os passos para construir as partes do objeto.
- ConcreteBuilder (Construtor Concreto): Implementação da interface Builder, que cria partes específicas do objeto e fornece um método para obter o resultado final.
- Director (Diretor): Define a sequência de passos para criar o objeto, usando um objeto Builder. O Diretor é opcional e o cliente pode trabalhar diretamente com o Builder.
- Product (Produto): O objeto que está sendo construído.
Exemplo de estrutura (Java):
// Produto
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 Builder
interface CarBuilder {
void buildEngine();
void buildWheels();
void buildColor();
Car getResult();
}
// ConcreteBuilder
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;
}
}
// Director (Opcional)
class CarDirector {
private CarBuilder builder;
public CarDirector(CarBuilder builder) {
this.builder = builder;
}
public void constructCar() {
builder.buildEngine();
builder.buildWheels();
builder.buildColor();
}
}
// Uso do cliente
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("Built car: " + sportsCar);
// Uso direto sem o Diretor
CarBuilder anotherSportsCarBuilder = new SportsCarBuilder();
anotherSportsCarBuilder.buildEngine();
anotherSportsCarBuilder.buildColor(); // Construção sem rodas
Car partialCar = anotherSportsCarBuilder.getResult();
System.out.println("Built partial car: " + partialCar);
}
}