design patterns

Entendendo o Design Pattern Abstract Factory com o Ligeiro

  • ligeiro Deividy Metheler Zachetti
  • 2024-08-20
blog-detail-hero

O Design Pattern Abstract Factory fornece uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas. Em outras palavras, ele nos permite criar objetos que pertencem a um grupo ou família, sem precisar nos pr eocupar com os detalhes de implementação de cada um deles.

Ligeiro nos mostrou um exemplo simulado de um mundo real, onde temos duas plataformas de pagamento: PayPal e PagSeguro. Vamos ver como o código funciona:

class PayPalCustomer {                                                                                                                                                                                                                                                 create() {
        // código para criar um cliente no PayPal
      }                                                                                                                                                                                                                                                                  }
    
    class PayPalGateway {
      pay(customer, value) {
        // código para processar o pagamento no PayPal
      }
    
      recordEvent(event) {
        // código para registrar o evento de pagamento no banco de dados
      }
    }
    
    class PagSeguroCustomer {
      create() {
        // código para criar um cliente no PagSeguro
      }
    }
    
    class PagSeguroGateway {
      pay(customer, value) {
        // código para processar o pagamento no PagSeguro
      }
    
      recordEvent(event) {
        // código para registrar o evento de pagamento no banco de dados
      }
    }
    
    class OrderModel {
      createPaymentCustomerStance(gateway, name, value) {
        if (gateway === 'pagseguro') {
          const customer = new PagSeguroCustomer();
          const pagSeguroGateway = new PagSeguroGateway();
          customer.create();
          const paymentGatewayInstance = pagSeguroGateway.createPaymentCustomerInstance(name, value);
          pagSeguroGateway.recordEvent(paymentGatewayInstance);
          return paymentGatewayInstance;
        } else {
          const customer = new PayPalCustomer();
          const payPalGateway = new PayPalGateway();
          customer.create();
          const paymentGatewayInstance = payPalGateway.createPaymentCustomerInstance(name, value);
          payPalGateway.recordEvent(paymentGatewayInstance);
          return paymentGatewayInstance;
        }
      }
    
      pay(gateway, name, value) {
        const gatewayOrderModel = this.getGatewayOrderModel(gateway);
        const customerInstance = gatewayOrderModel.createCustomerInstance(name, value);
        const paymentGatewayInstance = gatewayOrderModel.createPaymentGatewayInstance(customerInstance);
        gatewayOrderModel.recordEvent(paymentGatewayInstance);
      }
    
      getGatewayOrderModel(gateway) {
        if (gateway === 'pagseguro') {
          return new PagSeguroOrderModel();
        } else {
          return new PayPalOrderModel();
        }
      }
    }
    
    class PagSeguroOrderModel {
      createCustomerInstance(name, value) {
        const customer = new PagSeguroCustomer();
        customer.create();
        return { name, value, customer };
      }
    
      createPaymentGatewayInstance({ name, value, customer }) {
        const pagSeguroGateway = new PagSeguroGateway();
        return pagSeguroGateway.pay(customer, value);
      }
    
      recordEvent(event) {
        // código para registrar o evento de pagamento no banco de dados
      }
    }
    
    class PayPalOrderModel {
      createCustomerInstance(name, value) {
        const customer = new PayPalCustomer();
        customer.create();
        return { name, value, customer };
      }
    
      createPaymentGatewayInstance({ name, value, customer }) {
        const payPalGateway = new PayPalGateway();
        return payPalGateway.pay(customer, value);
      }
    
      recordEvent(event) {
        // código para registrar o evento de pagamento no banco de dados
      }
    }
    

Neste exemplo, temos duas classes principais: PayPal e PagSeguro, que representam as duas plataformas de pagamento. Cada uma delas tem suas próprias classes Customer e Gateway, que são responsáveis por criar clientes e processar pagamentos, respectivame nte.

Também temos a classe OrderModel, que é responsável por criar e processar pedidos de pagamento. Ela tem dois métodos principais: createPaymentCustomerStance e pay. O primeiro método é responsável por criar um cliente e processar o pagamento, enquanto o se gundo método é responsável por registrar o evento de pagamento no banco de dados.

A classe OrderModel também tem um método getGatewayOrderModel, que retorna a classe correta de OrderModel baseada no gateway de pagamento selecionado. Isso é feito usando o Design Pattern Abstract Factory.

Podemos ver que o código está dividido em duas partes principais: a parte que define as classes de pagamento e a parte que define a classe OrderModel. Isso nos permite alterar as classes de pagamento sem afetar a classe OrderModel, e vice-versa.

Além disso, podemos ver que o Design Pattern Abstract Factory nos permite criar objetos que pertencem a uma família, sem precisar nos preocupar com os detalhes de implementação de cada um deles. Isso nos permite escrever código mais flexível e fácil de manter.

Este é um exemplo simples, mas mostra como o Design Pattern Abstract Factory pode ser usado em JavaScript. Existem muitas outras formas de usar este padrão, e você pode adaptá-lo às suas próprias necessidades.

Espero que este post tenha ajudado a esclarecer o Design Pattern Abstract Factory e como ele pode ser usado em JavaScript. Se você gostou deste post, não esqueça de compartilhar e deixar um comentário! Até a próxima!


Esse blog post foi escrito utilizando AI ( especificamente whisper-large ) com o projeto https://github.com/S4mpl3r/youtube2blog.

O vídeo abaixo foi transcrito e utilizado como base para gerar o texto: