Padrão de criação - Builder

“Separar a construção de um objeto complexo da sua representação, para que o mesmo processo de construção possa criar diferentes representações” (GAMMA, E. et al, pág. 97)

public static class Builder { private SalaMultimidia salaMultimidia;

public Builder() {
  this.salaMultimidia = new SalaMultimidia();
}
public Builder comNome(String nome) {
  this.salaMultimidia.nome = nome;
  return this;
}
public Builder comCapacidade(int capacidade) {
  this.salaMultimidia.capacidade = capacidade;
  return this;
}
public Builder noLocal(Local local) {
  this.salaMultimidia.local = local;
  return this;
}
public Builder temProjetor(boolean temProjetor) {
  this.salaMultimidia.temProjetor = temProjetor;
  return this;
}
public Builder aPortaEstaAberta(boolean portaAberta) {
  this.salaMultimidia.portaAberta = portaAberta;
  return this;
}
public SalaMultimidia build() {
  return this.salaMultimidia;
} }

Podemos colocar restrição para criação da sala multimídia:

public SalaMultimidia build() { if(this.salaMultimidia.nome == null) throw new IllegalArgumentException(“Nome da sala obrigatório!”);

if(this.salaMultimidia.capacidade <= 0) throw new IllegalArgumentException(“Capacidade da sala deve ser maior que zero!”);

if(this.salaMultimidia.local == null) throw new IllegalArgumentException(“O local da sala é obrigatório!”);

return this.salaMultimidia; }

Vantagens:

  • Encapsula a complexidade da criação dos objetos
  • Permite criar os objetos em partes
  • Podemos esconder a representação interna do objeto

Desvantagem:

  • O cliente precisa conhecer o domínio para realizar criação do objeto
  • Pode ser necessário manter também o padrão get e set do JavaBean