Padrão Builder
Last updated
Was this helpful?
Last updated
Was this helpful?
Antes de começar a entender o padrão Builder, é interessante que veja o assunto de .
O Builder é um padrão de projeto criacional que permite a você construir objetos complexos passo a passo. Ele permite que você produza diferentes tipos e representações de um objeto usando o mesmo código de construção.
Imagine um objeto complexo que necessite de uma inicialização passo a passo trabalhosa de muitos campos e objetos agrupados. Tal código de inicialização fica geralmente enterrado dentro de um construtor monstruoso com vários parâmetros. Ou pior: espalhado por todo o código cliente.
Considere uma classe Usuário
que tenha vários atributos, sendo uns obrigatórios, outros opcionais. Além disso, queremos criar um objeto , ou seja, todos os seus atributos devem ser marcados como final
.
Uma vez que usamos construtores para criar objetos dessa classe, como poderiamos trazer essa abordagem de atributos obrigatórios e opcionais? Pare e pense por um momento e verá que criar vários construtores provavelmente não vai resolver esse cenário.
O padrão Builder sugere que você extraia o código de construção do objeto para fora de sua própria classe e mova ele para objetos separados chamados builders. “Builder” significa “construtor”, mas não usaremos essa palavra para evitar confusão com os construtores de classe.
O padrão organiza a construção de objetos em uma série de etapas (comNome
, comSobrenome
, etc.). Para criar um objeto você executa uma série de etapas em um objeto builder. A parte importante é que você não precisa chamar todas as etapas. Você chama apenas aquelas etapas que são necessárias para a produção de uma configuração específica de um objeto, no nosso caso, os atributos que são obrigatórios. Observe o exemplo abaixo:
Ao finalizar o processo de construção, o método toUsuario()
é chamado. Aqui, ainda acrescentamos uma validação para saber se o processo de construção foi bem executado, mas o mesmo poderia ter sido distribuido a medida que os métodos das etapas fossem chamados.
Assim, nosso processo de construção será semelhante ao exemplo abaixo.
A classe StringBuilder
é um exemplo claro do padrão Builder sendo usado para construir objetos imutáveis, nesse caso String
.
O padrão Builder permite que você construa objetos passo a passo, usando apenas aquelas etapas que você realmente precisa. Após implementar o padrão, você não vai mais precisar amontoar dúzias de parâmetros em seus construtores. O exemplo completo está .
No exemplo acima, utilizamos uma "técnica" para construir os métodos chamada de Fluent Interface. Veja uma explicação .