DEV Community

Yan.ts
Yan.ts

Posted on

DDD Factories

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 addressem um customer, quando usamos esse exemplo fica bem claro que o aggregate de customerprecisa de um um endereço, o Eric Evans fala que a Factory deve ser a responsavel por criar esse customerjá 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

Exemplo do livro domain drive design

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
  }
}
Enter fullscreen mode Exit fullscreen mode

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 )
Enter fullscreen mode Exit fullscreen mode

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)