Factory method
Factory Method ou Construtor virtual, na ciência da computação, é um padrão de projeto de software que permite às classes delegar para subclasses decidirem, isso é feito através da criação de objetos que chamam o método fabrica especificado numa interface e implementado por um classe filha ou implementado numa classe abstrata e opcionalmente sobrescrito por classes derivadas.
O padrão Factory Method, da forma como foi descrito no livro Design Patterns: Elements of Reusable Object-Oriented Software, contém os seguintes elementos:
Criar um objeto geralmente requer processos complexos não apropriados para incluir dentro da composição do objeto. A criação do objeto talvez necessite de uma duplicação de código significativa, talvez necessite informações não acessíveis para a composição do objeto, talvez não providencie um grau de abstração suficiente, ou então não faça parte da composição das preocupações do objeto. O padrão de design método fabrica maneja/trata esses problemas definindo um método separado para criação dos objetos, no qual as subclasses possam sobrescrever para especificar o "tipo derivado" do produto que vai ser criado.
Imagem: Vanderjoe · BY-SA · Openverse
Este padrão é muito utilizado em frameworks para definir e manter relacionamentos entre objetos. O framework Spring, dependendo da configuração, pode utilizar um Factory Method para criar os seus beans. Este padrão pode ser utilizado na construção de um framework que suporta aplicações que apresentam múltiplos documentos ao usuário. Normalmente este tipo de aplicação manipula um número variável de formatos de documento e, por isso, este framework deve ser flexível o bastante para suportar qualquer formato. Uma solução para este problema poderia disponibilizar, no framework, o código para alguns dos formatos mais utilizados. Mas, na prática, esta solução seria uma implementação pouco flexível, e até mesmo incompleta, já que é custoso implementar os mais variados formatos. O padrão Factory Method propõe uma solução que deixa para o cliente (a implementação da aplicação) a tarefa de suportar os formatos necessários e para o framework o papel de definição de uma abstração que oferece uma interface única para criação de documentos.
Imagem: Mark Esguerra · BY-NC-ND · Openverse
Factory Method é utilizado para criar objetos assim como o Template Method é usado para criar algoritmos. Uma superclasse específica todos os padrões e comportamentos genéricos, e depois delega os detalhes da criação para as subclasses que são fornecidas pelo cliente. O Factory Method faz uma design mais customizável e somente um pouco mais complicado. Outros design patterns requerem novas classes, enquanto que o Factory Method precisa somente de uma no operação. As pessoas regularmente utilizam o Factory Method como o padrão de criar objetos; mas não é necessário se: O Factory Method é similar ao Abstract Factory (mas sem a ênfase as famílias) e também os métodos fábricas são especificados rotineiramente por uma arquitetura framework, e depois implementado pelo usuário do framework.
Neste exemplo, uma aplicação, que é construída através de um framework baseado no padrão Factory Method, suporta a criação de documentos do tipo MeuDocumento. O framework é constituído pelas classes abstratas Aplicacao e Documento. A aplicação disponibiliza as classes concretas MinhaAplicacao e MeuDocumento. A classe MinhaAplicacao é uma implementação da abstração definida pela classe Aplicacao.
Diagrama
A chave deste padrão está na declaração do método abstrato criaDocumento, da classe Aplicacao, e na sua utilização pelo método novoDocumento. Este arranjo permite que o método novoDocumento crie documentos sem conhecer os detalhes de implementação, existentes em cada tipo de documento suportado pela aplicação. Isto permite que a implementação do método criaDocumento (neste exemplo situada na classe MinhaAplicacao) varie livremente, para atender os diversos formatos possivelmente suportados, sem que seja necessário modificar o código das classes abstratas.
Código em Java
Este código, escrito na linguagem Java, demonstra a implementação do diagrama mostrado acima.
Código em VB.NET
O mesmo exemplo acima, em linguagem Visual Basic .NET.
Neste próximo exemplo, é demonstrado a utilização do padrão Factory Method para a criação de diferentes refrigerantes. Veja a imagem a seguir:
Diagrama
A imagem abaixo mostra como funciona o padrão Factory Method em forma de imagem: Observação: as classes RefrigeranteCola e RefrigeranteLaranja estendem a classe abstrata Refrigerante. Segue o código do diagrama acima (em Java): A imagem abaixo mostra como funciona o padrão Factory Method em forma de imagem:
Imagem: Sae1962 · BY-SA · Openverse
Os exemplos a seguir mostram a codificação do padrão Factory Method em outras linguagens. Obs: os exemplos são aleatórios retirados da internet.


