Skip to content

kalkehcoisa/dio-java-patterns

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🧩 Catálogo de Produtos - Padrões de Projeto (Java Puro + Spring)

Este projeto foi desenvolvido para unificar e explorar na prática os principais Padrões de Projeto abordados nos laboratórios:

A ideia é mostrar como os mesmos padrões podem ser implementados em Java puro e depois integrados e potencializados por uma aplicação Spring Boot.


📦 Estrutura do Projeto (Módulos)

dio-java-patterns/
├── catalogo-core/          # Módulo Java puro (sem Spring)
│   └── src/main/java/com/exemplo/catalogo/core/
│       ├── model/          # Produto.java
│       ├── singleton/      # CatalogoSingleton.java
│       ├── strategy/       # OrdenacaoStrategy + implementações
│       └── facade/         # RelatorioFacade.java
│
└── catalogo-spring/        # Módulo Spring Boot
    └── src/main/java/com/exemplo/catalogo/spring/
        ├── controller/     # ProdutoController.java
        ├── service/        # ProdutoService.java
        ├── repository/     # ProdutoRepository.java
        ├── entity/         # ProdutoEntity.java
        └── dto/            # Request/Response DTOs

🧠 Padrões de Projeto Implementados

Padrão Localização (Java puro) Como é usado no Spring
Singleton CatalogoSingleton – cache em memória com instância única (getInstance()) O ProdutoService chama o singleton diretamente para acessar o cache, mostrando integração Java puro → Spring
Strategy OrdenacaoStrategy (interface) + PorNomeStrategy / PorPrecoStrategy O ProdutoService recebe um parâmetro de ordenação via controller e escolhe a estratégia em tempo de execução
Facade RelatorioFacade – método gerarRelatorio(produtos, formato) que abstrai a geração de CSV/JSON O ProdutoController chama a facade sem conhecer os detalhes de formatação
Repository (Spring) Não se aplica (é padrão Spring) ProdutoRepository estende JpaRepository, abstraindo toda a persistência com H2

🚀 Como Executar o Projeto

Pré-requisitos

  • JDK 17+
  • Maven 3.8+

Passo 1: Compilar e instalar o módulo catalogo-core

cd catalogo-core
mvn clean install

Passo 2: Executar a aplicação Spring

cd ../catalogo-spring
mvn spring-boot:run

A aplicação estará disponível em http://localhost:8080

(Opcional) Acessar o console H2

  • URL: http://localhost:8080/h2-console
  • JDBC URL: jdbc:h2:mem:produtosdb
  • Usuário: sa
  • Senha: (deixe em branco)

🌐 Endpoints da API REST

Método Endpoint Descrição Exemplo de uso
GET /produtos Lista todos os produtos (ordem padrão de inserção) curl http://localhost:8080/produtos
GET /produtos?ordenacao=nome Lista ordenada por nome (Strategy) curl "http://localhost:8080/produtos?ordenacao=nome"
GET /produtos?ordenacao=preco Lista ordenada por preço (Strategy) curl "http://localhost:8080/produtos?ordenacao=preco"
POST /produtos Adiciona um novo produto (atualiza banco H2 + cache Singleton) curl -X POST -H "Content-Type: application/json" -d '{"nome":"Headset","preco":199.90}' http://localhost:8080/produtos
GET /produtos/{id} Busca um produto pelo ID curl http://localhost:8080/produtos/1
GET /produtos/relatorio Gera relatório JSON (Facade) curl http://localhost:8080/produtos/relatorio
GET /produtos/relatorio?formato=CSV Gera relatório CSV para download curl http://localhost:8080/produtos/relatorio?formato=CSV --output produtos.csv

🔍 Explicação dos Padrões na Prática

1. Singleton – CatalogoSingleton

  • Garante que apenas uma instância do cache de produtos exista durante toda a execução.
  • Implementação thread-safe com volatile e synchronized (padrão double-checked locking).
  • O cache é populado com 5 produtos iniciais.

2. Strategy – OrdenacaoStrategy

  • Permite alternar dinamicamente o algoritmo de ordenação da lista de produtos.
  • O ProdutoService escolhe a estratégia com base no parâmetro ordenacao recebido via query string.
  • Novas estratégias podem ser adicionadas sem modificar o service (princípio Aberto/Fechado).

3. Facade – RelatorioFacade

  • Simplifica a interface para geração de relatórios em diferentes formatos.
  • O controller chama um único método gerarRelatorio(), passando apenas os produtos e o formato desejado.
  • Internamente, a facade decide se gera CSV ou JSON, isolando essa complexidade.

4. Repository (Spring Data JPA) – ProdutoRepository

  • Embora não seja um padrão GoF clássico, é um padrão de arquitetura muito útil.
  • Abstrai completamente o acesso ao banco de dados H2.
  • O Spring gera automaticamente as implementações de CRUD.

🧪 Fluxo de Dados (Exemplo: Adicionar Produto)

  1. Controller recebe um POST /produtos com JSON { "nome": "Mousepad", "preco": 49.90 }
  2. Service chama repository.save() → insere no H2 e obtém o id gerado
  3. Service cria um objeto Produto do módulo core e adiciona no CatalogoSingleton
  4. Controller retorna o DTO com os dados + ID

Resultado: o produto fica disponível tanto no banco (para consultas futuras) quanto no cache Singleton (para acesso rápido via lista/relatório).


📚 Referências e Inspirações


📝 Licença

Este projeto é de uso educacional. Sinta-se à vontade para estudar, modificar e compartilhar.


Desenvolvido com ☕ e Spring Boot.


About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors