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.
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ã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 |
- JDK 17+
- Maven 3.8+
cd catalogo-core
mvn clean installcd ../catalogo-spring
mvn spring-boot:runA aplicação estará disponível em http://localhost:8080
- URL:
http://localhost:8080/h2-console - JDBC URL:
jdbc:h2:mem:produtosdb - Usuário:
sa - Senha: (deixe em branco)
| 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 |
- Garante que apenas uma instância do cache de produtos exista durante toda a execução.
- Implementação thread-safe com
volatileesynchronized(padrão double-checked locking). - O cache é populado com 5 produtos iniciais.
- Permite alternar dinamicamente o algoritmo de ordenação da lista de produtos.
- O
ProdutoServiceescolhe a estratégia com base no parâmetroordenacaorecebido via query string. - Novas estratégias podem ser adicionadas sem modificar o service (princípio Aberto/Fechado).
- 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.
- 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.
- Controller recebe um
POST /produtoscom JSON{ "nome": "Mousepad", "preco": 49.90 } - Service chama
repository.save()→ insere no H2 e obtém oidgerado - Service cria um objeto
Produtodo módulo core e adiciona noCatalogoSingleton - 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).
- Repositório original - Padrões Java puro
- Repositório original - Padrões com Spring
- Design Patterns: Elements of Reusable Object-Oriented Software (GoF)
Este projeto é de uso educacional. Sinta-se à vontade para estudar, modificar e compartilhar.
Desenvolvido com ☕ e Spring Boot.