Today I Learned 10/05/2022
Factories
Dinâmica
Implementação
Factories
Desloque a responsabilidade de criar instâncias de objetos complexos e agregados para um objeto separado, que pode não ter responsabilidade no modelo de domínio, mas ainda faz parte do design do domínio. Forneça uma interface que encapsule toda a criação complexa e que não exija que o cliente faça referência às classes concretas dos objetos que estão sendo instanciados. Crie agregados inteiros de uma única vez, reforçando suas invariáveis.
EVANS, Eric. Domain Drive Design
Ou seja, no exemplo usado no meu post sobre services em DDD eu comento sobre como funcionam aggregates e dou exemplo do address
em um customer
, quando usamos esse exemplo fica bem claro que o aggregate de customer
precisa de um um endereço, o Eric Evans fala que a Factory deve ser a responsavel por criar esse customer
já com o endereço, sendo assim a Factory fica responsável por criar um aggregate por completo, e não os objects e value objects de forma separada
Dinâmica
Nesse exemplo podemos ver qual a logica de funcionamento. O cliente vai especificar para a Factory o que ele quer em formato de parâmetros, a Factory vai criar o agregado de acordo com o que o cliente pediu e vai retornar para ele.
Implementação
seguindo o exemplo do customer a implementação da Factory fica muito simples
export class CustomerFactory{
static create(name: string): Customer{
return new Customer(uuid(), name)
}
static createWithAddress(name: string, address: Address): Customer{
const customer = new Customer(uuid(), name);
customer.changeAddress(address);
return customer
}
}
onde o client
que chamar a factory
vai falar se quer um customer
normal ou um customer
com address
já associado, esse exemplo poderia ser expandido pra um customer
já ativo, etc...
e para usar a factory
seria da seguinte forma
const address = new Address("Rua 123", 123, "any zip", "salvador" );
let customer = CustomerFactory.createWithAddress("John", address )
observe que o address
não tem uma Factory própria, isso se deve ao fato de que a Factory é para o agregado como um todo e não para cada object
e value object
contido em um agregado pois isso não faria sentido
Ainda estou aprendendo sobre DDD e se quiser ver melhor o código pode dar uma olhada nesse Repositório
Top comments (0)