1. Padrões de Projeto
_______________________________________
Creational Patterns
Abstract Factory
Proporciona uma interface para criar famílias de objetos relacionados ou
dependentes sem especificar suas classes concretas
Use Abstract Factory quando:
o O sistema deve ser independente de como seus produtos são criados,
compostos e representados
o O sistema deve ser configurado com uma de múltiplas famílias de produtos
o Uma família de objetos de produtos relacionados é projetada para ser usada
junta, e você precisa assegurar essa restrição
o Você quer proporcionar uma biblioteca de classes de produtos, e você só
quer revelar suas interfaces, não suas implementações
Builder
Separa a construção de um objeto complexo da sua representação, de forma que o
mesmo processo de construção possa criar diferentes tipos de representações
Use o Builder quando:
o O algoritmo para criar um objeto complexo deva ser independente das
partes que constituem o objeto e de como ele é montado
o O processo de construção deva permitir representações diferentes para o
objeto que é construído
2. Factory Method
Define uma interface para criar um objeto, mas deixa as subclasses decidirem qual
classe instanciar. O Factory Method permite uma classe deferir a instanciação às
subclasses
Use Factory Method quando:
o Uma classe não pode antecipar a classe de objetos que ela deve criar
o Uma classe quer que suas subclasses especifiquem os objetos que ela cria
Prototype
Especifica os tipos de objetos para criar usando uma instância prototípica, e cria
novos objetos copiando esse protótipo
Use o Prototype quando/em:
o As classes para serem instanciadas são especificadas em run-time, como
por exemplo, por dynamic loading
o Sistemas que utilizam o padrão Abstract Factory para criação de objetos.
Neste caso, a hierarquia de classes pode se tornar muito complexa e o
3. padrão Prototype pode ser uma alternativa mais simples, por realizar a
mesma tarefa com um número reduzido de classes;
o Sistemas que possuem componentes cujo estado inicial possui poucas
variações e onde é conveniente disponibilizar um conjunto pré-estabelecido
de protótipos que dão origem aos objetos que compõem o sistema.
Singleton
Garante que uma classe tem apenas uma instância, e proporciona um ponto de
acesso global a ela
Use Singleton quando:
o Deve haver exatamente uma instância de uma classe, e ela deve ser
acessível aos clientes a partir de um ponto-de-acesso conhecido
4. Structural Patterns
Adapter
Converte a interface de uma classe em outra interface que o cliente espera.
Adapter permite que classes que normalmente nao poderiam trabalhar juntas,
devido à incompatibilidade de interfaces, possam fazê-lo.
Use o Adapter quando:
o Você quer usar uma classe existente, e sua interface não é adequada àquela
que você precisa
o Você quer criar uma classe reusável que coopera com classes não-
relacionadas ou não-previstas, isto é, classes que não necessariamente têm
interfaces compatíveis
o Você precisa usar várias subclasses existentes, mas é impraticável adaptar
suas interfaces especializando cada uma. Um object adapter pode adaptar a
interface de suas classes pais
Bridge
Desacopla uma interface de sua implementação, de forma que ela possa variar
independentemente
Use o Bridge quando:
o Você quer evitar um vínculo entre a abstração e a implementação. Esse
pode ser o caso, por exemplo, quando a implementação deve ser
selecionada em tempo de execução
o Ambas a abstração e a implementação devem ser estensíveis através de
subclasses
o Mudanças na implementação de uma abstração não deveriam ter impacto
sobre os clientes, isto é, seu código não deveria ser recompilado
5. Composite
Compõe objetos em estruturas de árvore para representar hierarquias parte-todo.
Composite deixa os clientes tratar objetos individuais e composições de objetos
livremente
Use Composite quando:
o Você quer representar hierarquias parte-todo de objetos
o Você quer que os clientes possam ignorar a diferença entre composições de
objetos e objetos individuais. Clientes vão tratar os objetos na estrutura
composta de forma uniforme
Decorator
Anexa responsabilidades adicionais a um objeto dinamicamente. Decoradores
fornecem uma alternativa flexível em relação à herança, para estender
funcionalidades
6. Use o Decorator:
o Para adicionar responsabilidades a objetos individuais dinâmica e
transparentemente, isto é, sem afetar os outros objetos
o Para responsabilidades que podem ser retiradas
o Quando a extensão por subclasses é impraticável. Algumas vezes uma
grande quantidade de combinações de de subclasses é possível, causando
uma explosão na hierarquia
Proxy
Fornece um objeto representante ou um marcador de outro objeto para controlar o
acesso ao mesmo
Proxy é aplicável toda vez que há uma necessidade de uma referência mais versátil
ou sofisticada do que um simples ponteiro para um objeto
Alguns tipos de proxy:
o Remote proxy
o Virtual proxy
o Protection poxy
o Smart reference
7. Behavioral Patterns
Strategy
Define uma família de algoritmos, encapsula cada um, e faz deles intercambiáveis.
Strategy permite que o algoritmo varie independentemente de clentes que usam-no
Use Strategy quando:
o Várias classes relacionadas diferem apenas em seus comportamentos.
Strategy proporciona um modo de configurar uma classe com um de muitos
comportamentos
o Você precisa de diferentes variantes de um algoritmo
o Uma classe define muitos comportamentos, e eles aparecem como
múltiplas declarações condicionais nas suas operações. Ao invés de várias
condições, mova desvios condicionais relacionados para sua propria classe
Strategy
8. Command
Encapsula uma requisição como um objeto, deixando-o, dessa forma, parametrizar
os clientes com diferentes requisições
Use o Command quando você quer:
o Parametrizar objetos para realizar alguma ação
o Especificar, enfileirar e executar requisições em tempos diferentes
o Suportar undo
o Suportar transações
Observer
Define uma dependência um-para-muitos entre objetos de forma que quando um
objeto muda de estado, todos os seus dependentes são notificados e atualizados
automaticamente
Use o Observer em qualquer uma das seguintes situações:
o Quando uma abstração tem dois aspectos, um dependente do outro.
Encapsular esses aspectos em objetos separados permite você variá-los e
usá-los independentemente
o Quando uma mudança em um objeto requer mudanças em outros objetos e
você não sabe quantos objetos serão mudados
o Quando um objeto deve ser capaz de notificar outros objetos sem fazer
deduções sobre quem esses objetos são. Em outras palavras, você não quer
esses objetos fortemente acoplados
9. Template Method
Define o esqueleto de um algoritmo em uma operação, deferindo alguns passos
para as subclasses. Template Method permite que subclasses redefinam certos
passos de algum algoritmo sem mudar a estrutura do algoritmo
O Template Method deve ser usado:
o Para implementar a parte invariante de um algoritmo uma vez e deixar para
as subclasses a implementação do comportamento que pode variar
o Quando comportamentos comuns entre subclasses devem ser fatorados e
localizados em uma classe comum para evitar duplicação de código