Design Patterns – Factory Method

2 11 2007

Factory Method, é um padrão que fornece uma interface para criação de famílias de objectos relacionados ou dependentes, sem especificar suas classes concretas.

Em Java a criação de um objecto é feito da seguinte maneira:

XPTO objecto = new XPTO();

Mas neste caso, temos que a criação de objectos é um pouco inflexível uma vez que estes são sempre do mesmo tipo. Em muitos casos, a natureza dos objectos que são criados pode variar com as necessidades do programa e, a abstracção do processo de criação de objectos para uma classe especial de “criação“, pode tornar o seu programa mais flexível e geral. Assim surge o Factory Method.

Intenção

O Factory Method é criado com a intenção de definir uma interface para a criação de objectos, mas permitir que sejam as classes derivadas a decidir qual a classe a instanciar.

Aplicabilidade:

Utilizar o padrão Factory Method quando:

  • Uma classe não pode antecipar a classe dos objectos que deve criar;
  • Uma classe pretende que sejam as suas classe derivadas a especificar os objectos que devem ser criados.

A sua representação pode ser expressa da seguinte forma (representação em UML):

uml.png

Explicando as entidades:

· Creator - declara o factory method (método de fabricação) que retorna o objecto da classe Product (produto). Este elemento também pode definir uma implementação básica que retorna um objecto de uma classe ConcreteProduct (produto concreto) básica;

· ConcreteCreator – deriva do factory method e retorna um objecto da classe ConcreteProduct;

· Product – define uma interface para os objectos criados pelo factory method;

· ConcreteProduct – uma implementação para a interface Product.

Vamos ver um exemplo bastante simples:

Para entender como o padrão Factory funciona, vamos observar o seguinte diagrama:

car_diagram.png

Carro é a classe base (pai) e as classes Vectra, Omega, Gol e Golf derivam dela (filhos).

A classe CarroFactory é a classe Factory que decide qual das subclasses retornar, dependendo dos argumentos que você passar ao método factory dela.

Nós definimos o método getCarro(), como o método factory que recebe um parâmetro (tipo de objecto) e retorna uma instância da classe Carro, representado no diagrama por :carro.

Não importa ao programador qual a classe que ele retorna, desde que todos eles tenham os mesmos métodos, mas diferentes implementações. Qual a subclasse de Carro que será retornada é estritamente decidido pela classe CarroFactory.

Vamos considerar um caso simples onde nós podemos usar uma classe Factory. Suponha que nós temos um sistema de consulta de preços de veículos. Informamos qual o carro queremos consultar o respectivo preço. Então a classe factory retorna-nos a respectiva instância e então consultamos o preço.

Vamos observar a implementação:

 

code1.png

Agora a nossa classe Factory, que é bem simples, decide qual classe será instanciada, dependendo do parâmetro do tipo passado para o método getClass( ).

code2.png


 

O FactoryExample irá ser o nosso main:

code3.png


Desta forma, vemos que a partir dos argumentos dados a classe CarroFactory devolve o o respectivo objecto.

Referências:

[http://pt.wikipedia.org/wiki/Factory_Method]

[http://www.guj.com.br/java.tutorial.artigo.137.1.guj]

[http://www.javacamp.org/designPattern/factory.html]