Padrões de projeto detalhados Factory Method, Abstract Factory Nazareno Andrade Padrões de projeto (GoF) De criação Estruturais De comportamento Problema-exemplo Sistema para criar e exibir currículo Um currículo tem página de rosto, página de conteúdo e página de encerramento Design? Problema: queremos agora um currículo resumido que tem as mesmas funcionalidades do original, mas uma página de conteúdo diferente Factory Method Intenção Definir uma interface para criar objetos, mas deixar as subclasses decidirem que classe instanciar. Permite adiar a instanciação para subclasses. Aplicabilidade classe não conhece antecipadamente a classe dos objetos que deve criar classe quer que suas subclasses especifiquem os objetos que criam 6 Colaborações Problema-exemplo 2 Serviço de envio de pedidos Inicialmente enviamos sempre por email Queremos agora enviar via REST para fornecedores maiores Problema Como garantir que, em um contexto, mensagem e serviço de mensagem serão da mesma “Família”? Isso acontece por exemplo no look-and-feel de interfaces gráficas Solução: Abstract Factory Solução: Fornece uma interface para a criação de uma família de objetos relacionados ou dependentes sem especificar classes concretas. UML Aplicabilidade um sistema deve ser independente de como seus produtos são criados, compostos ou representados um sistema deve ser configurado como um produto de uma família de múltiplos produtos uma família de objetos-produto for projetada para ser usada em conjunto e você necessita garantir esta restrição você quer fornecer uma biblioteca de classes de produtos e quer revelar somente suas interfaces, não suas implementações Factory Method, Abstract Factory 12 Conseqüências isolamento das classes concretas torna fácil a troca de famílias de produtos promove a harmonia entre produtos é difícil, porém, suportar novos tipos de produtos Factory Method, Abstract Factory 13 Usos conhecidos Família de classes necessária para lidar com banco de dados Família de classes necessária para lidar com placa de rede Família de classes para lidar com look-andfeel das interfaces Dúvidas?