Aprenda a usar o padrão Builder para construir objetos complexos em Java
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.