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