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:
- 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.
- 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.
- 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:
- Consistência: Garante que todos os objetos sejam criados de maneira consistente.
- Controle: Facilita o controle sobre como os objetos são criados e configurados.
- 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.