14.03.2015 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!