Padrões de Projeto (comumente relacionados na literatura de TI como “Design
Patterns”) são soluções para problemas comuns que encontramos no desenvolvimento ou manutenção de um software orientado a objetos. Atualmente não se concebe um processo de desenvolvimento de software sério sem a utilização da orientação a objetos, pois esta permite agregar qualidades importantes aos sistemas desenvolvidos sob seus paradigmas, como a extensibilidade e a reusabilidade. Contudo, somente por estar utilizando-a, não é garantia de obter essas qualidades. Para criar as melhores soluções é preciso seguir um processo detalhado para obter uma análise dos requisitos, funcionais ou não funcionais, e desenvolver um projeto que os satisfaça e que possibilite submetê-los a teste para constatar eventuais falhas, se deseja que o projeto tenha uma arquitetura flexível para acomodar futuros problemas e requisitos sem a necessidade da realização do re-projeto. Os padrões de projetos tornam mais fácil reutilizar soluções e arquiteturas bem-sucedidas para construir softwares orientados a objetos de forma flexível e fácil de manter. O uso de padrões de projeto pode reduzir a complexidade do processo de projetar software. Além disso, o software orientado a objetos bem projetado possibilita aos projetistas reutilizar e empregar componentes preexistentes em sistemas futuros. Existem diferentes tipos de padrões de projetos, que visam resolver diferentes tipos de problemas.
Os padrões podem ter propósito criacional, estrutural ou comportamental. Os padrões
criacionais abstraem o processo de criação dos objetos. Os estruturais lidam com a composição de classes ou objetos. Já os comportamentais caracterizam as maneiras pelas quais classes ou objetos interagem e distribuem responsabilidades.
Os padrões de projeto criacionais fornecem vários mecanismos de criação de objetos,
que aumentam a flexibilidade e reutilização de código já existente. Eles ajudam a tornar um sistema independentemente de como seus objetos são criados, compostos e representados. Um exemplo seria o “Factory Method”, que é um padrão criacional de projeto que fornece uma interface para criar objetos em uma superclasse, mas permite que as subclasses alterem o tipo de objetos que serão criados. O Factory Method elimina a necessidade de colocar classes específicas da aplicação no código.
Os padrões estruturais explicam como montar objetos e classes em estruturas maiores,
mas ainda mantendo essas estruturas flexíveis e eficientes. Eles se preocupam com a forma como classes e objetos são compostos para formar estruturas maiores. Os de classes utilizam a herança para compor interfaces ou implementações, e os de objeto descrevem maneiras de compor objetos para obter novas funcionalidades. A flexibilidade obtida pela composição de objetos provém da capacidade de mudar a composição em tempo de execução o que não é possível com a composição estática (herança de classes). Temos como exemplo o padrão denominado “Bridge”. O Bridge é um padrão de projeto estrutural que permite que você divida uma classe grande ou um conjunto de classes intimamente ligadas em duas hierarquias separadas—abstração e implementação—que podem ser desenvolvidas independentemente umas das outras.
Os padrões comportamentais são voltados aos algoritmos e a designação de
responsabilidades entre objetos. Eles não descrevem apenas padrões de objetos ou de classes, mas também os padrões de comunicação entre os objetos. Os padrões comportamentais de classes utilizam a herança para distribuir o comportamento entre classes, e os padrões de comportamento de objeto utilizam a composição de objetos em contrapartida a herança. Alguns descrevem como grupos de objetos que cooperam para a execução de uma tarefa que não poderia ser executada por um objeto sozinho. Um exemplo é o “Chain of Responsability”, que é um padrão de projeto comportamental que permite que você passe pedidos por uma corrente de handlers. Ao receber um pedido, cada handler decide se processa o pedido ou o passa adiante para o próximo handler na corrente.