Este repositório contém exemplos de implementação dos padrões de projeto (Design Patterns) clássicos do GoF (Gang of Four) em Java. O objetivo é fornecer exemplos claros e didáticos para estudo e referência.
- Singleton: Garante que uma classe tenha apenas uma instância e fornece um ponto global de acesso a ela.
- Exemplo:
DatabaseConnectiongarante uma única conexão com o banco de dados.
- Exemplo:
- Factory Method: Define uma interface para criar um objeto, mas deixa as subclasses decidirem qual classe instanciar.
- Exemplo:
NotificationFactorycria diferentes tipos de notificações (SMS, Email, Push) sem expor a lógica de criação ao cliente.
- Exemplo:
- Builder: Separa a construção de um objeto complexo da sua representação, permitindo a criação de diferentes representações passo a passo.
- Exemplo:
ComputerBuilderconstrói um computador com diferentes configurações de hardware (HDD, RAM, Placa de Vídeo, etc.).
- Exemplo:
- Abstract Factory: Permite produzir famílias de objetos relacionados sem especificar suas classes concretas.
- Exemplo:
GUIFactorycria botões e checkboxes compatíveis para diferentes sistemas operacionais (Windows, MacOS). - Quando é recomendado: Quando o sistema deve ser independente de como seus produtos são criados e quando produtos devem ser usados em conjunto (famílias).
- Quando não é recomendado: Quando a complexidade adicional não justifica a necessidade de criar famílias de objetos.
- 📖 Documentação Detalhada e Cenários de Uso
- Exemplo:
- Prototype: Permite copiar objetos existentes sem fazer o código depender de suas classes.
- Exemplo: Clonagem de formas geométricas (
Circle,Rectangle) mantendo suas propriedades. - Quando é recomendado: Quando a criação direta de um objeto é custosa (tempo/recursos) ou sua configuração é complexa.
- Quando não é recomendado: Quando a clonagem de referências circulares é muito complexa ou a criação direta é trivial.
- 📖 Documentação Detalhada e Cenários de Uso
- Exemplo: Clonagem de formas geométricas (
- Adapter: Permite que classes com interfaces incompatíveis trabalhem juntas. Atua como um "adaptador" entre duas interfaces.
- Exemplo:
MediaAdapterpermite que umAudioPlayertoque formatos de arquivo (VLC, MP4) que originalmente não suportava.
- Exemplo:
- Observer: Define uma dependência um-para-muitos entre objetos, de modo que quando um objeto muda de estado, todos os seus dependentes são notificados e atualizados automaticamente.
- Exemplo:
NewsAgencynotifica váriosNewsChannelquando há uma nova notícia.
- Exemplo:
- Strategy: Define uma família de algoritmos, encapsula cada um deles e os torna intercambiáveis. Permite que o algoritmo varie independentemente dos clientes que o utilizam.
- Exemplo:
ShoppingCartpode processar pagamentos usando diferentes estratégias (Cartão de Crédito, Paypal).
- Exemplo:
- Command: Encapsula uma solicitação como um objeto, permitindo parametrizar clientes com diferentes solicitações, enfileirar ou registrar solicitações e suportar operações que podem ser desfeitas.
- Exemplo:
RemoteControlexecuta comandos (LightOnCommand,LightOffCommand) para controlar umaLight.
- Exemplo:
Aqui está a lista completa dos padrões GoF restantes que podem ser implementados futuramente:
- Abstract Factory
- Prototype
- Bridge
- Composite
- Decorator
- Facade
- Flyweight
- Proxy
- Chain of Responsibility
- Interpreter
- Iterator
- Mediator
- Memento
- State
- Template Method
- Visitor
Para compilar e executar os exemplos, você pode usar o terminal na raiz do projeto.
-
Compile o código (exemplo para Linux/Mac):
javac -d out -sourcepath src src/com/richardikeda/javapatterns/*/*.java
-
Execute um exemplo específico. Por exemplo, para executar o exemplo do padrão Builder:
java -cp out com.richardikeda.javapatterns.builder.BuilderExample
Outros exemplos disponíveis para execução:
com.richardikeda.javapatterns.singleton.DatabaseExamplecom.richardikeda.javapatterns.factory.FactoryExamplecom.richardikeda.javapatterns.observer.ObserverExamplecom.richardikeda.javapatterns.strategy.StrategyExamplecom.richardikeda.javapatterns.adapter.AdapterExamplecom.richardikeda.javapatterns.command.CommandExamplecom.richardikeda.javapatterns.abstractfactory.AbstractFactoryExamplecom.richardikeda.javapatterns.prototype.PrototypeExample