Padrão Abstract Factory Projeto de Sistemas de Software Hazel Carvalho Crato Sumário • Abstract Factory – Propósito – Motivação – Aplicabilidade – Estrutura – Participantes – Colaborações – Conseqüências – Exemplo de Código © LES/PUC-Rio Abstract Factory • É classificado como um padrão de criação, também conhecido como Kit. • Propósito – Prover uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas. © LES/PUC-Rio Motivação Exemplo 1: © LES/PUC-Rio Motivação Exemplo 2: © LES/PUC-Rio Motivação • Diferentes padrões look-and-feel definem diferentes aparências (look) e comportamentos (feel) para um widget de uma interface de usuário. Exemplos: barras de rolagem, janelas, botões etc. • Para ser portável através dos padrões look-and-feel, uma aplicação não deve instanciar os widgets diretamente de suas classes concretas para uma aparência ou comportamento particular. • Para facilitar a alteração da aparência e do comportamento futuramente, defina uma classe abstrata GUIFactory que declara uma interface para criar cada tipo de widget básico. • Defina ainda uma interface para cada tipo de widget e subclasses concretas que implementam widgets para um específico padrão look-and-feel. © LES/PUC-Rio Motivação • A interface de GUIFactory possui uma operação que retorna um novo widget concreto para cada widget abstrato. • Há uma sub-classe concreta de GUIFactory para cada padrão look-and-feel. • Cada sub-classe implementa as operações para criar o widget apropriado para o respectivo look-and-feel. • Clientes criam os widgets apenas através da GUIFactory sem saber quem são widgets concretos para um específico look-and-feel. • Uma GUIFactory reforça as dependências entre as classes concretas de widgets. © LES/PUC-Rio Aplicabilidade • O padrão deve ser usado quando: – Um sistema deve ser implementado independente de como os produtos são criados, compostos e representados. – Um sistema deve ser configurado com uma das múltiplas famílias de produtos. – Uma familia de um produto relacionado é projetada para ser utilizada junta, e faz-se necessário o reforço dessa restriçao. – Deseja-se prover uma biblioteca de classes de produtos e deseja-se revelar apenas as suas interfaces, mas não suas implementações. © LES/PUC-Rio Estrutura © LES/PUC-Rio Participantes • AbstractFactory – Declara uma interface para operações que criam produtos abstratos. • ConcreteFactory – Implementa as operações para criar produtos concretos. • AbstractProduct – Declara uma interface para um tipo de produto. • ConcreteProduct – Define um produto a ser criado pela fábrica concreta correspondente. – Implementa a interface AbstractProduct. • Client – Usa apenas interfaces declaradas pelas classes AbstractFactory e AbstractProduct. © LES/PUC-Rio Colaborações • Normalmente uma única instância da classe ConcreteFactory é criada em tempo de execução. • AbstractFactory delega a criação de produtos concretos para a respectiva subclasse ConcreteFactory. • A classe ConcreteFactory cria produtos que possuem uma implementação particular, por exemplo: todos os widgets de uma WinFactory concreta. © LES/PUC-Rio Conseqüências • Vantagens – Abstract Factory isola classes concretas. – Facilita o intercâmbio de famílias de produtos. – Promove consistência entre produtos. • Desvantagem – Suporte a novos tipos de produtos é dicífil. © LES/PUC-Rio Exemplo de Código Estrutura © LES/PUC-Rio Abstract Factory © LES/PUC-Rio Concrete Factory © LES/PUC-Rio Abstract Product © LES/PUC-Rio Concrete Product © LES/PUC-Rio Transfer Object © LES/PUC-Rio Client © LES/PUC-Rio Perguntas?