Design patterns (padrões de projeto) são uma coleção de soluções abstratas para problemas recorrentes no desenvolvimento de software orientado a objetos. Essas soluções são apresentadas na forma de templates que podem ser aplicados em diferentes situações e diferentes linguanges de programação, porém com estrutura similar, provendo uma solução que contribui para a flexibilidade, extensibilidade, portabilidade e reúso de código da aplicação.
Elementos de um Design Pattern
Em geral, um design pattern possui quatro elementos essenciais:
- Nome: Um identificador que podemos usar para descrever um problema de design, suas soluções em problemas em uma palavra ou duas. Possibilita a comunicação com os colegas e criação de documentação.
- Problema: descreve quando aplicar o padrão, explicando o respectivo problema e contexto. As vezes o problema irá incluir uma lista de premissão que devem ser atendidas para que faça sentido aplicar o padrão.
- Solução: descreve os elementos de design que resolvem o problema, seus respectivos relacionamentos, responsabilidades e colaborações. Descreve como distribuir estes elementos para resolver o problema.
- Consequências: descreve os resultados e as consequências de aplicar o padrão. As consequências geralmente consistem em efeitos de espaço e tempo, e em algumas vezes, problemas relacionados a linguagem e implementação, tornando-se assim, um ponto crítico a se considerar ao avaliar uma alternativa de design.
Organização dos Design Patterns
Os design patterns podem ser divididos em três tipos:
- Criacional: abstrai o processo de instanciação. O modo como os objetos são criados, compostos e representados torna-se independente do sistema, por esconder seus detalhes de implementação sob a utilização de herança, trazendo ampla flexibilidade e afastando a complexidade de um processo de instanciação de objetos.
- Estrutural: se interessam em como classes e objetos são compostos em estruturas maiores. Eles descrevem maneiras de compor objetos para realizar novas funcionalidades, sem adicionar complexicidade e garantindo a flexibilidade, evitando assim classes do tipo “Frankenstein”.
- Comportamental: são focados em algorítmos e na designação de responsabilidades entre objetos. Eles caracterizam fluxos de controle complexos que são difíceis de acompanhar em tempo de execução, para então tirar seu foco deste fluxo e deixá-lo concentrar-se somente na forma que que os objetos se comunicam um com os outros.
Lista de Design Patterns
Irei fazer uma compilação dos design patterns dividindo-os em seus três tipos e atualizando a lista abaixo com links. A lista é baseada no GoF (Gang of Four, autores do livro Design Patterns: Elements of Reusable Object-Oriented Software) e em outras ótimas fontes complementares sobre o assunto.
Criacionais
- Abstract Factory
- Builder
- Factory Method
- Prototype
- Service Locator
- Singleton
Estruturais
- Adapter
- Bridge
- Composite
- Decorator
- Facade
- Flyweight
- Proxy
Comportamentais
- Chain of Responsability
- Command
- Double Dispatch
- Hook Classes
- Hook Method
- Interpreter
- Iterator
- Mediator
- Memento
- Null Object (Novo!)
- Observer
- State
- Strategy
- Template Method
- Visitor
Quaisquer sugestões são bem vindas!
Espero que ajude, até mais!