Padrões GoF – Factory Method 1 Factory Method • Quando uma parte de um SSOO precisa dos serviços de um objeto, essa parte envia mensagem para este último. • No entanto para que um objeto receba mensagens, ele deve existir. Não faz sentido falar em “envio de mensagens” para um objeto que não existe. • Para um objeto existir, ele deve ser instanciado a partir de uma classe. • Instanciar uma classe significa criar um objeto dessa classe. – Fisicamente falando, isso significa (1) alocar espaço em memória para armazenar o objeto e (2) iniciar o seu estado (ou seja, os valores de seus atributos). • Após a instanciação, o objeto pode prover serviços para outros objetos. (ou seja, para sua região de código cliente) Factory Method • Entretanto, a operação de instanciação de um objeto pode ser bastante complexa. • Além disso, pode ser que não seja adequado fazer com que uma região de código que necessite de um serviço tenha uma referência direta para a classe (objeto) que o fornece. – Uma razão para isso pode ser o fato de que a forma de implementar tal serviço ser instável, no sentido de precisar ser alterada no futuro. – Se a região de código instanciar diretamente a classe que lhe fornece determinado serviço, essa região fica definitivamente acoplada a essa classe fornecedora e a sua forma específica de prover o serviço requerido. • Uma forma de resolver o problema descrito acima é através de uma fábrica de objetos... Factory Method • Uma fábrica de objetos corresponde a uma classe cuja responsabilidade é criar outros objetos, quando requisitada. • Essa fábrica retorna o objeto criado na forma de uma referência para uma superclasse abstrata ou para uma interface. – Dessa maneira, a região cliente, que previamente criava o objeto para lhe prover o serviço, agora fica dependente desse serviço através de um acoplamento abstrato. • Com efeito, a classe que realmente fornece o serviço requerido pode ser substituída sem que a região de código cliente precise de modificação. Factory Method • Essa é a solução correspondente ao padrão Factory Method, cujo objetivo é definir uma interface para instanciar objetos. • Note que a fábrica de objetos precisa fazer referência às classes concretas cujos objetos fornecem o serviço requerido, o que é um exemplo de acoplamento concreto. • Entretanto, essa referência fica localizada em uma região de código particular (na fábrica de objetos) e é conseqüentemente aceitável. • Note também que quaisquer mudanças nas classes que fornecem o serviço em questão ficam localizadas à fábrica de objetos e não afetam os clientes. Factory Method • Outro aspecto importante sobre o padrão Factory Method é que sua utilização adiciona complexidade ao projeto. – Na verdade, essa é uma tônica na maioria dos padrões de projeto: eles adicionam flexibilidade às custas de adicionarem complexidade à solução. • A decisão por utilizar esse padrão deve levar em consideração o fato de a classe que fornece o serviço ser realmente suscetível a mudanças futuras. • Em caso contrário, a referência (instanciação) direta da classe que fornece o serviço (em vez de usar o Factory Method) é uma alternativa mais viável. Factory Method - Estrutura