Objetivo do Factory method é definir qual será a ... - Unisinos
Objetivo do Factory method é definir qual será a ... - Unisinos
Objetivo do Factory method é definir qual será a ... - Unisinos
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Creational Patterns – <strong>Factory</strong> <strong>method</strong><br />
<strong>Objetivo</strong> <strong>do</strong> <strong>Factory</strong> <strong>method</strong> é <strong>definir</strong><br />
<strong>qual</strong> será a subclasse que utilizada um<br />
cliente.<br />
Permite que o sistema funcione sem o<br />
conhecimento prévio das subclasses.<br />
Assim um framework pode ser construí<strong>do</strong><br />
apenas com as interfaces e permitir que<br />
o cliente defina as implementações e,<br />
principalmente, quais delas serão<br />
instanciadas e no momento apropria<strong>do</strong>.<br />
26-ago-08 Leandro Tonietto 50
Creational Patterns – <strong>Factory</strong> <strong>method</strong><br />
Exemplo:<br />
Aplicativo similar ao OpenOffice.org<br />
Um aplicativo de automação de tarefas de escritório pode<br />
gerenciar <strong>qual</strong>quer uma das aplicações-tarefas (parte <strong>do</strong><br />
framework).<br />
Dois pontos de abstração: aplicativo-tarefa de escritório e o<br />
<strong>do</strong>cumento ele manipula. Ambos são classes abstratas, para<br />
controlar o código comum entre as aplicações e permitir que<br />
a implementação de cada tarefa realize apenas o que é<br />
específico.<br />
O framework não pode inicializar um objeto em particular<br />
porque ele não tem conhecimento prévio sobre <strong>qual</strong> classe<br />
deve usar. Esta tarefa fica delegada a um méto<strong>do</strong> que<br />
determina <strong>qual</strong> é a implementação que será usada e com<br />
<strong>qual</strong> tipo de <strong>do</strong>cumento. Isto é o factory <strong>method</strong>.<br />
O méto<strong>do</strong> instancia um objeto de uma classe de várias<br />
possíveis para uma classe abstrata ou interface.<br />
26-ago-08 Leandro Tonietto 51
Exemplo:<br />
Creational Patterns – <strong>Factory</strong> <strong>method</strong><br />
26-ago-08 Leandro Tonietto 52
Estrutura:<br />
Creational Patterns – <strong>Factory</strong> <strong>method</strong><br />
26-ago-08 Leandro Tonietto 53
Creational Patterns – <strong>Factory</strong> <strong>method</strong><br />
Aplicação. Quan<strong>do</strong>:<br />
“Uma classe não pode antecipar a classe<br />
<strong>do</strong>s objetos que ela deve criar” [1].<br />
Uma classe quer que suas subclasses<br />
especifiquem os objetos que ela deve<br />
utilizar.<br />
Classes que delegam para um méto<strong>do</strong> a<br />
escolha de uma de muitas possibilidades.<br />
Apenas uma deve ser escolhida.<br />
26-ago-08 Leandro Tonietto 54
Creational Patterns – <strong>Factory</strong> <strong>method</strong><br />
Conseqüências:<br />
Eliminam a necessidade de conhecimento prévio<br />
das implementações específicas. Flexibilidade para<br />
novas implementações num mesmo sistema.<br />
Desvantagem é quan<strong>do</strong> é necessário evolução na<br />
criação das subclasses.<br />
Permite uma criação de um objeto de forma mais<br />
requintada, nas apenas uma instanciação simples.<br />
Por exemplo, a criação um <strong>do</strong>cumento pode ser feita com<br />
auxílio de alguma janela de diálogo<br />
Conecta hierarquias paralelas.<br />
26-ago-08 Leandro Tonietto 55
Creational Patterns – <strong>Factory</strong> <strong>method</strong><br />
Conseqüências:<br />
26-ago-08 Leandro Tonietto 56
Creational Patterns – <strong>Factory</strong> <strong>method</strong><br />
Questões de implementação:<br />
Duas variações <strong>do</strong> padrão:<br />
Uma classe Creator não implementa o factory <strong>method</strong> que<br />
ela cria.<br />
A classe Creator implementa o méto<strong>do</strong> de retorno<br />
diretamente.<br />
Méto<strong>do</strong>s de fábrica parametriza<strong>do</strong>s, onde a escolha<br />
da classe é feita com algum parâmetro.<br />
Méto<strong>do</strong>s de fábrica são sempre abstratos ou virtuais<br />
na interface e implementa<strong>do</strong>s nas subclasses.<br />
É possível fazer o uso de templates para<br />
implementar o factory. Veja maiores detalhes em<br />
[1].<br />
26-ago-08 Leandro Tonietto 57
Creational Patterns – <strong>Factory</strong> <strong>method</strong><br />
Exemplo:<br />
Continuan<strong>do</strong> a aplicação de tratamento de imagens,<br />
proposta no pattern builder.<br />
Cada descritor de classe (FilterDescriptor),<br />
retorna uma instância <strong>do</strong> filtro de imagem<br />
apropria<strong>do</strong>.<br />
Para executar o filtro na interface apropriada o<br />
objeto da classe FilterUI obtém o filtro de<br />
imagem através <strong>do</strong> FilterDescriptor. Como ele<br />
não tem conhecimento prévio sobre os filtros, o<br />
factory <strong>method</strong> da FilterDescriptor pode<br />
instanciar o objeto apropria<strong>do</strong> <strong>do</strong> filtro.<br />
O framework continua isola<strong>do</strong> da aplicação.<br />
26-ago-08 Leandro Tonietto 58
Exemplos:<br />
Creational Patterns – <strong>Factory</strong> <strong>method</strong><br />
26-ago-08 Leandro Tonietto 59
Creational Patterns – <strong>Factory</strong> <strong>method</strong><br />
26-ago-08 Leandro Tonietto 60