Padrões de Projeto (em inglês, Design Patterns), são combinações de classes e algoritmos associados, com propósitos comuns de projeto. Tais padrões são normalmente soluções consagradas que se baseiam nas estruturas da orientação a objetos em sua melhor forma. Nas palavras de José Carlos Marcoratti: “padrões de projetos são soluções para problemas que alguém um dia teve e resolveu aplicando um modelo que foi documentado e que você pode adaptar integralmente ou de acordo com necessidade de sua solução”.
Cada padrão de projeto descreve um problema e o cerne da sua solução, de tal forma que você possa usar essa solução mais de um milhão de vezes, sem nunca fazê-lo da mesma maneira.
São 4 os elementos importantes que definem um padrão de projeto, a saber:
Para se descrever e catalogar um Padrão de Projeto com total completude de informações são necessários os seguintes dados:
Nome do Pattern e Classificação | Propósito | Conhecido Como |
Motivação | Aplicação | Estrutura |
Colaborações | Consequencias | Implementação |
Código Exemplo | Usos Conhecidos | Padrões Relacionados |
Os padrões de projeto, basicamente, se dividem em 3 categorias:
Padrões de Criação
Padrões Estruturais
Padrões Comportamentais
São eles:
- Abstract Factory: permite criar uma família de objetos relacionados ou dependentes por meio de uma interface sem especificar suas classes concretas.
- Builder: separa a construção de um objeto complexo da sua representação de modo que o mesmo processo de construção possa criar diferentes representações.
- Factory Method: define uma interface para a criação de um objeto, deixando as subclasses decidirem que classe instanciar. Permite a uma classe postergar a instanciação de subclasses.
- Prototype: especifica os tipos de objetos a serem criados usando uma instância protótípica e cria novos objetos copiando este protótipo.
- Singleton: garante que uma classe tenha somente uma única instância e fornece um ponto global de acesso pra ela.
São eles:
- Adapter: converte a interface de uma classe em outra interface esperada pelos clientes. Permite que certas classes trabalhem em conjunto, pois de outra forma seria impossível por causa de suas interfaces incompatíveis.
- Bridge: separa uma abstração da sua implementação, de modo que as duas possam variar independentemente.
- Composite: compõe objetos em estrutura de árvore para representar hierarquias do tipo partes-todo. Permite que os clientes da estrutura tratem objetos individuais e composições de objetos de maneira uniforme.
- Decorator: atribui responsabilidades adicionais a um objeto dinamicamente. Fornece uma alternativa flexível à utilização de subclasses para a extensão de funcionalidades.
- Façade: fornece uma interface unificada para um conjunto de interfaces de um subsistema. Define uma interface de nível mais alto que torna o subsistema mais fácil de usar.
- Flyweight: usa compartilhamento para suportar grandes quantidades de objetos, de granularidade fina, de maneira eficiente.
- Proxy: fornece um objeto representante ou um marcador de outro objeto para controlar o acesso ao mesmo.
São eles:
- Chain of Responsibility: evita o acoplamento entre o remetente e o destinatário de uma solicitação, dando a mais de um objeto a possibilidade de tratar a solicitação.
- Command: encapsula uma solicitação como um objeto, permitindo a parametrização de clientes com diferentes solicitações, o enfileiramento e o registro de solicitações e o suporte a operações que possam ser, por exemplo, desfeitas.
- Interpreter: dada uma linguagem, define uma representação para sua gramática juntamente com um interpretador que usa a representação para interpretar sentenças nesta linguagem.
- Iterator: fornece uma maneira de acessar sequencialmente os elementos de um objeto agregado sem expor sua representação subjacente.
- Mediator: Define um objeto que encapsula a interação entre um conjunto de objetos.
- Memento: Sem violar o encapsulamento, captura e externaliza um estado interno de um objeto, de modo que o mesmo possa posteriormente ser restaurado para este estado.
- Observer: define uma relação de dependência 1:N de forma que quando um certo objeto (assunto) tem seu estado modificado os demais (observadores) são notificados; Possibilita baixo acoplamento entre os objetos observadores e o assunto.
- State: permite objeto alterar seu comportamento quando estado interno muda.
- Strategy: permite que uma família de algoritmos seja utilizada de modo independente e seletivo.
- Template Method: define o esqueleto de um algoritmo em uma operação, postergando a definição de alguns passos para subclasses.
- Visitor: define operações independentes a serem realizadas sobre elementos de uma estrutura.
Let’s Practice!!!
A questão desta edição é a 25 do ENADE 2011. Tente resolver e logo em seguida olhe a resolução mais abaixo.
Analisando as alternativas:
I - FALSA. Como visto, logo acima, Prototype não é um padrão Estrutural e sim de Criação.
II - FALSA. O objetivo de Singleton é garantir que uma classe tenha uma única instância.
III - VERDADEIRA
IV - VERDADEIRA
Portanto,como as alternativas III e IV estão corretas, a letra que corresponde a esse resultado é a letra E.
Referências:
http://brizeno.wordpress.com/padroes/
http://www.ic.unicamp.br/~vanini/mc302/PadroesDeProjeto.pdf
http://www.inf.ufes.br/~vitorsouza/wp-content/uploads/java-br-curso-padroesdeprojeto-slides02.pdf
http://pt.wikipedia.org/wiki/Padr%C3%A3o_de_projeto_de_software
http://www.macoratti.net/Default.aspx