Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Entendo o beneficio, mas, de fato precisamos?

Entendo a utilização da FabricaDeUsuario, que me parece uma união do Factory com o Builder. Mas quero levantar o ponto da necessidade da classe. Claro que o benefício criacional é obvio, mas, ao mesmo tempo, não traria um nível de complexidade maior ao projeto?

Outra pergunta. Seria interessante limitar a criação dos objetos apenas a fábrica?

2 respostas
solução!

Oii Manoel, tudo bem?

A FabricaDeUsuario combina conceitos de Factory e Builder para facilitar a criação de objetos complexos, como o Usuario. Isso é especialmente útil quando a entidade tem muitos atributos ou quando a criação do objeto envolve lógica adicional (como validações ou configurações padrão).

Benefícios:

  1. Clareza e Manutenção: Ao invés de ter múltiplos construtores ou métodos estáticos, a fábrica permite métodos com nomes claros que indicam exatamente o que tá sendo configurado.
  2. Flexibilidade: Facilita a criação de objetos parcialmente configurados. Por exemplo, você pode criar um usuário sem endereço e adicionar o endereço depois.
  3. Encapsulamento da Lógica de Criação: A lógica de criação e configuração fica centralizada na fábrica, o que facilita a manutenção e evolução do código.

Complexidade Adicional

Sim, a introdução de uma fábrica pode adicionar um nível de complexidade ao projeto. Mas, essa complexidade é geralmente compensada pelos benefícios mencionados acima, especialmente em projetos de médio a grande porte.

Limitar a Criação dos Objetos à Fábrica

Limitar a criação de objetos apenas à fábrica pode ser uma boa prática, pois:

  1. Consistência: Garante que todos os objetos sejam criados de maneira consistente.
  2. Controle: Facilita o controle sobre como os objetos são criados e configurados.
  3. Facilidade de Alteração: Se a forma de criação mudar, você só precisa alterar a fábrica, e não todas as partes do código onde os objetos são instanciados.

Exemplo Prático

Vamos supor que, no futuro, você precise adicionar uma validação para garantir que o CPF seja único. Se a criação do usuário estiver centralizada na fábrica, você só precisará adicionar essa lógica na FabricaDeUsuario, e todos os usuários criados a partir daí seguirão essa regra.

public Usuario comNomeCpfNascimento(String nome, String cpf, LocalDate nascimento) throws InvalidCpfException {
    if (!isCpfUnique(cpf)) {
        throw new InvalidCpfException("CPF já cadastrado.");
    }
    this.usuario = new Usuario(cpf, nome, nascimento, "");
    return this.usuario;
}

private boolean isCpfUnique(String cpf) {
    // Lógica para verificar se o CPF é único
    return true; // Exemplo simplificado
}

Espero ter ajudado.

Um abraço e bons estudos.

Obrigado Lorena, fez muito sentido o que você falou :D