Abstract Factory Pattern • Algumas aplicações precisam criar objetos de classes que podem mudar • ex: elementos de um sistema GUI. – Diferentes padrões precisam de objetos de classes diferentes (motif, presentation manager, etc.) – uma classe para cada objeto visivel, para cada padrão. Solução: • Criar “Fábrica Abstrata”, com métodos para a criação de cada componente. • Criar “Componente Abstrato”, com métodos do componente • Fábricas concretas retornam elementos dos componentes concretos – FabricaComponentesPM, FabricaComponentesMotif – JanelaPM, JanelaMotif, BarraRolamentoPM, BarraRolamentoMotif Aplicabilidade • sistema precisa ser independente de como seus produtos são criados, compostos e representados • configuração do sistema envolve a escolha de uma entre várias famílias de produtos • uma família de produtos foi criada para ser usada em conjunto, e queremos reforçar isso • desenvolvedor quer criar uma biblioteca de classe de produtos, mas quer revelar apenas as interfaces. Estrutura Participantes • Fábrica Abstrata: determina interface de criação dos produtos • Fábrica Concreta: responsável pela implementação da criação de objetos concretos • Produto Abstrato: define interface do produto • Produto Concreto: define produto a ser criado, implementa interface do produto abstrato • Cliente: utiliza interface definida pelos componentes abstratos do padrão. Consequências + isolamento das classes concretas + facilita implementação e troca de famílias de produtos + promove consistencia entre produtos da mesma família – dificulta adicionar novos produtos: precisamos aumentar interface da fábrica abstrata e de todas as suas sublcasses concretas. Tornando o padrão mais geral: fábricas extensíveis • associar a cada produto um código (número, string, etc.) • apenas uma operação de criação de produtos, parametrizada pelo código • problema: objetos retornados são vistos como tendo mesma interface em Java