Abstract Factory Edeyson Andrade Gomes www.edeyson.com.br
Introdução Objetivo Prover uma interface para criar uma família de objetos relacionados ou dependentes sem especificar suas classes concretas Também chamado de Kit 2
Resumo Parece semelhante ao padrão Factory Method Porém, em vez do cliente chamar um método de criação (Factory Method), ele possui um objeto de criação (Abstract Factory) e o usa para chamar os métodos de criação Onde Factory Method quer que você seja diferente (via herança) para criar objetos diferentes, o Abstract Factory quer que você tenha algo diferente 3
Resumo Se o cliente possuir uma referência a uma Abstract Factory diferente, toda a criação será diferente Note que a estrutura do objeto composto é a mesma, o que muda são os componentes concretos em sua criação O fato de todos os métodos de criação estarem na mesma subclasse de uma Abstract Factory permite satisfazer a restrição de criar apenas objetos relacionados ou dependentes 4
Quando Usar Quando um sistema deve ser independente de como seus produtos são criados, compostos e representados Ex.: O Cliente não quer ou deve saber como um Computador é criado O sistema deve ser configurado com uma entre várias famílias de produtos Uma família de produtos relacionados foi projetada para uso conjunto e deve-se implementar essa restrição Família Intel, Alpha, Mips Para fornecer uma biblioteca de classes e revelar sua interface, não sua implementação Evitar que objetos sejam diretamente criados 5
Estrutura Genérica 6
Participantes Fábrica Abstrata Define uma interface para as operações que criam objetos como produtos abstratos Fábrica Concreta Implementa as operações para criar objetos para produtos concretos Produto Abstrato Define uma interface para objetos de um tipo ProdutoConcreto Define um objeto produto a ser criado pela Fábrica Concreta correspondente Implementa o Tipo Produto Abstrato Cliente Usa apenas interfaces definidas pelo Tipo Fábrica 7
Colaborações Normalmente uma única instância de uma classe Fábrica Concreta é criada em tempo de execução Essa Fábrica cria objetos tendo uma implementação particular Para criar produtos diferentes os clientes devem usar uma Fábrica Concreta diferente 8
Conseqüências O padrão isola classes concretas Uma Fábrica encapsula a responsabilidade e o processo de criação de objetos de produtos e isola os clientes das classes de implementação O cliente manipula instâncias através de suas interfaces abstratas Facilita a troca de famílias de produtos Uma mudança numa única linha de código pode ser suficiente para mudar a Fábrica Concreta que a aplicação usa A família inteira de produtos muda de uma vez 9
Conseqüências A classe da Fábrica Concreta só aparece em um lugar: Onde ela é instanciada Promove a consistência entre produtos Produtos de uma determinada família devem funcionar conjuntamente e não misturados com produtos de outra família O padrão permite implementar esta restrição com facilidade 10
Conseqüências O lado negativo: Prover suporte a novos tipos de produtos é difícil O motivo é que a Fábrica Abstrata fixa o conjunto de produtos que podem ser criados Dar suporte a mais produtos força a extensão da interface da Fábrica o que envolve mudanças na Fábrica Abstrata e em todas suas subclasses 11
Implementação Factory como padrão Singleton Uma aplicação normalmente só precisa de uma única instância de uma Fábrica por família de produtos O padrão Singleton ajuda a controlar a instância única Criação dos produtos O tipo Fábrica apenas define a interface de criação Quem cria os objetos são as Fábricas Concretas Tais casses (Fábricas Concretas) são freqüentemente implementadas usando o padrão Factory Method Uma Fábrica Concreta faz override do Factory Method de cada produto 12
Exemplo Aparência de Interfaces Gráficas (GUI) Para diferentes modelos de look-and-feel (Motif, Windows, Mac, Presentation Manager, etc.) temos formas diferentes de manipular janelas, scroll bars, menus, etc. 13
Exercício Solução dos problemas das Casas Vamos tirar a responsabilidade de criar o objeto concreto da subclasse e colocar numa classe que é uma Fábrica de Objetos. Faremos Fábricas que constroem objetos de Aço para casas de aço, independendo de estrutura, Fábricas de Madeira, Vidro, etc. Como Planejar as Fábricas (Abstract Factory) Quais são os objetos a criar? Porta Parede Sala Quarto objetox 14
Exercício Como Planejar as Fábricas (Abstract Factory) Quais as famílias dos objetos? Tipos de Fábricas? Aço Vidro Madeira FamíliaX Criar Interface de Fábrica com: PortaAB criaporta() ParedeAB criaparede() SalaAB criasala() QuartoAB criaquarto() ObjetoXAB criaobjetox() 15
Exercício Como Planejar as Fábricas (Abstract Factory) Quantas Fábricas Concretas devem existir FábricaAço FábricaVidro FábricaMadeira FábricaFamíliaX Solução no Eclipse. Questão: Como fica o reuso da solução? 16