#4 DP: Facade
O que é? O Facade é um padrão de projeto do tipo estrutural. Ele consiste na criação de uma classe intermediária (ou fachada) que expõe uma interface simplificada para um conjunto de classes ou processos mais complexos. Seu principal objetivo é desacoplar a lógica de negócios da complexidade de múltiplas instâncias e chamadas internas, permitindo que outras partes do sistema interajam com uma interface unificada e mais limpa. Isso melhora a organização do código, facilita a manutenção e reduz a dependência direta de implementações internas. Exemplo Antes: Sua classe de serviço conhecendo todas as instancias e invocações @Service public class PedidoService { private final EstoqueService estoqueService; private final PagamentoService pagamentoService; private final EmailService emailService; public PedidoService(EstoqueService estoqueService, PagamentoService pagamentoService, EmailService emailService) { this.estoqueService = estoqueService; this.pagamentoService = pagamentoService; this.emailService = emailService; } public void processarPedido() { Cliente cliente = new Cliente("João"); Produto produto = new Produto("Notebook"); if (estoqueService.temProduto(produto)) { pagamentoService.processarPagamento(cliente, produto); emailService.enviarConfirmacao(cliente); } else { throw new RuntimeException("Produto sem estoque."); } } } Depois com Facade: O fluxo desacoplado da classe serviço: Note que o estoqueService.temProduto(produto) nao foi passado para o facade, deve ser evitado passar regras e decisões para o facade, use apenas para invocações public class PedidoService { private final EstoqueService estoqueService; private final PedidoFacade pedidoFacade; public PedidoService(EstoqueService estoqueService, PedidoFacade pedidoFacade) { this.estoqueService = estoqueService; this.pedidoFacade = pedidoFacade; } public void processarPedido() { Cliente cliente = new Cliente("João"); Produto produto = new Produto("Notebook"); if (!estoqueService.temProduto(produto)) { throw new RuntimeException("Produto sem estoque."); } pedidoFacade.finalizarPedido(cliente, produto); } } public class PedidoFacade { private final PagamentoService pagamentoService; private final EmailService emailService; public PedidoFacade(PagamentoService pagamentoService, EmailService emailService) { this.pagamentoService = pagamentoService; this.emailService = emailService; } public void finalizarPedido(Cliente cliente, Produto produto) { pagamentoService.processarPagamento(cliente, produto); emailService.enviarConfirmacao(cliente); } } Esse padrão ajuda especialmente quando você tem processos que precisam ser reutilizados em mais de uma parte do sistema, encapsulando toda a complexidade por trás de uma única interface limpa.

O que é?
O Facade é um padrão de projeto do tipo estrutural. Ele consiste na criação de uma classe intermediária (ou fachada) que expõe uma interface simplificada para um conjunto de classes ou processos mais complexos.
Seu principal objetivo é desacoplar a lógica de negócios da complexidade de múltiplas instâncias e chamadas internas, permitindo que outras partes do sistema interajam com uma interface unificada e mais limpa. Isso melhora a organização do código, facilita a manutenção e reduz a dependência direta de implementações internas.
Exemplo
Antes:
- Sua classe de serviço conhecendo todas as instancias e invocações
@Service
public class PedidoService {
private final EstoqueService estoqueService;
private final PagamentoService pagamentoService;
private final EmailService emailService;
public PedidoService(EstoqueService estoqueService,
PagamentoService pagamentoService,
EmailService emailService) {
this.estoqueService = estoqueService;
this.pagamentoService = pagamentoService;
this.emailService = emailService;
}
public void processarPedido() {
Cliente cliente = new Cliente("João");
Produto produto = new Produto("Notebook");
if (estoqueService.temProduto(produto)) {
pagamentoService.processarPagamento(cliente, produto);
emailService.enviarConfirmacao(cliente);
} else {
throw new RuntimeException("Produto sem estoque.");
}
}
}
Depois com Facade:
O fluxo desacoplado da classe serviço:
- Note que o estoqueService.temProduto(produto) nao foi passado para o facade, deve ser evitado passar regras e decisões para o facade, use apenas para invocações
public class PedidoService {
private final EstoqueService estoqueService;
private final PedidoFacade pedidoFacade;
public PedidoService(EstoqueService estoqueService, PedidoFacade pedidoFacade) {
this.estoqueService = estoqueService;
this.pedidoFacade = pedidoFacade;
}
public void processarPedido() {
Cliente cliente = new Cliente("João");
Produto produto = new Produto("Notebook");
if (!estoqueService.temProduto(produto)) {
throw new RuntimeException("Produto sem estoque.");
}
pedidoFacade.finalizarPedido(cliente, produto);
}
}
public class PedidoFacade {
private final PagamentoService pagamentoService;
private final EmailService emailService;
public PedidoFacade(PagamentoService pagamentoService, EmailService emailService) {
this.pagamentoService = pagamentoService;
this.emailService = emailService;
}
public void finalizarPedido(Cliente cliente, Produto produto) {
pagamentoService.processarPagamento(cliente, produto);
emailService.enviarConfirmacao(cliente);
}
}
Esse padrão ajuda especialmente quando você tem processos que precisam ser reutilizados em mais de uma parte do sistema, encapsulando toda a complexidade por trás de uma única interface limpa.