O padrão de projeto Builder é um padrão criacional que visa abstrair o processo de instânciação de objetos, tornando o sistema independente da forma como os objetos são criados. Ele permite a construção de objetos complexos de maneira incremental, passo a passo, o que é particularmente útil quando um objeto precisa ser montado em várias etapas ou quando as informações necessárias para sua construção são fornecidas em fases distintas.
Entre suas características principais, podemos destacar:
Separação de construção e representação: O padrão Builder separa a lógica de construção de um objeto de sua representação final, permitindo que a construção seja feita de forma flexível e modular.
Facilidade de configuração: Ao utilizar o Builder, é possível criar objetos com diferentes configurações sem a necessidade de mudar o código cliente. Isso proporciona maior flexibilidade no processo de criação.
Imutabilidade do objeto final: O objeto resultante da construção é geralmente imutável, ou seja, não pode ser alterado após sua criação. Isso evita modificações indesejadas e garante a integridade do objeto.
Para ilustrar o funcionamento do padrão, imagine a criação de um Produto com diversos atributos, como preço, título, descrição e categoria. Usando o padrão Builder, podemos construir o produto de forma flexível, especificando os diferentes atributos em etapas:
`
public class Produto {
private Double preco;
private String titulo;
private String descricao;
private String categoria;
private Produto(Builder builder) {
this.preco = builder.preco;
this.titulo = builder.titulo;
this.descricao = builder.descricao;
this.categoria = builder.categoria;
}
public static class Builder {
private Double preco;
private String titulo;
private String descricao;
private String categoria;
public Builder setPreco(Double preco) {
this.preco = preco;
return this;
}
public Builder setTitulo(String titulo) {
this.titulo = titulo;
return this;
}
public Builder setDescricao(String descricao) {
this.descricao = descricao;
return this;
}
public Builder setCategoria(String categoria) {
this.categoria = categoria;
return this;
}
public Produto build() {
return new Produto(this);
}
}
}
public class Principal {
public static void main(String[] args) {
Produto produto = new Produto.Builder()
.setPreco(999.9)
.setTitulo("Smartphone")
.setCategoria("Celulares")
.setDescricao("Um celular Android")
.build();
}
}
`
Neste exemplo, o Produto é criado utilizando um ProdutoBuilder, permitindo a configuração dos atributos de forma incremental e modular. O uso do padrão Builder torna o processo mais legível e organizado.
Vantagens do Padrão Builder:
Desacoplamento: O cliente não precisa saber como os objetos são criados, apenas interage com a interface do Builder, o que aumenta a flexibilidade e a coesão do sistema.
Flexibilidade: O Builder permite criar diferentes representações de um objeto de forma fácil e controlada, sem a necessidade de modificar a lógica de construção do objeto.
Manutenção: Como a construção do objeto é separada da sua representação, o código se torna mais modular e fácil de manter.
Esse padrão contribui significativamente para a legibilidade e a escalabilidade do código, especialmente quando se trabalha com objetos complexos que exigem diferentes configurações.
Source link
lol