Aprenda a usar o padrão Builder para construir objetos complexos em Java

Por Gaspar Barancelli Junior em 06 de março de 2023

O padrão de projeto Builder permite a criação de objetos complexos passo a passo. Ele é especialmente útil quando você precisa criar objetos que requerem muitos parâmetros ou quando deseja que o processo de criação de objetos seja mais flexível.

Exemplo de implementação em Java

Em Java, podemos implementar o padrão Builder de várias maneiras, mas aqui vamos falar sobre uma abordagem comum. Vamos começar definindo a classe que queremos construir. Suponha que queremos construir um objeto chamado "Carro" que tenha várias propriedades, como modelo, cor, número de portas, motor e assim por diante. A primeira coisa que precisamos fazer é definir a classe Carro:

public class Carro {
    private String modelo;
    private String cor;
    private int numPortas;
    private String motor;
    // outros atributos...

    // Construtor privado
    private Carro(Builder builder) {
        this.modelo = builder.modelo;
        this.cor = builder.cor;
        this.numPortas = builder.numPortas;
        this.motor = builder.motor;
        // inicializar outros atributos...
    }

    // getters e setters
    // ...

    // Classe Builder
    public static class Builder {
        private String modelo;
        private String cor;
        private int numPortas;
        private String motor;
        // outros atributos...

        public Builder(String modelo) {
            this.modelo = modelo;
        }

        public Builder cor(String cor) {
            this.cor = cor;
            return this;
        }

        public Builder numPortas(int numPortas) {
            this.numPortas = numPortas;
            return this;
        }

        public Builder motor(String motor) {
            this.motor = motor;
            return this;
        }

        // outros métodos para definir outros atributos...

        public Carro build() {
            return new Carro(this);
        }
    }
}

Como você pode ver, temos uma classe interna chamada "Builder" que é responsável por construir a instância de "Carro". O construtor da classe "Builder" recebe um parâmetro obrigatório, neste caso o modelo do carro. Em seguida, temos métodos que podemos usar para definir os outros atributos do carro. Observe que esses métodos retornam o próprio objeto Builder para que possamos chamá-los em cadeia.

Por fim, temos o método "build()", que cria a instância final de "Carro" com base nos valores definidos no objeto Builder.

Agora, podemos usar essa classe de várias maneiras para construir objetos Carro. Aqui está um exemplo:

Carro carro = new Carro.Builder("Ferrari")
                .cor("vermelho")
                .numPortas(2)
                .motor("V8")
                .build();

Este código cria um novo objeto Carro com o modelo "Ferrari", cor "vermelho", 2 portas e um motor V8.

Conclusão

O padrão Builder é muito útil quando precisamos construir objetos complexos com muitos parâmetros. Ele torna o código mais legível e fácil de manter, além de permitir que possamos criar objetos com diferentes configurações facilmente.

// Livros recomendados relacionados ao assunto do post

// Compartilhe esse Post