23 de março de 2010

Design Patterns – Patterns Criacionais: Factory Method

escrito por Ruppel, enquanto ele mesmo

A terceira pattern do livro é bem conhecida: é uma Factory. A factory tem 3 usos bem claros:

  1. Você está criando um framework no qual você precisa instanciar uma classe que estará fora do framework.
  2. Você quer que uma subclasse especifique qual tipo de produto a sua classe pai (ou mãe?) deve criar
  3. Você quer concentrar o conhecimento de quais são as classes concretas (implementações) usadas no seu sistema em um único lugar.

Para solucionar esses três casos distintos, usa-se a simples idéia de ter uma classe abstrata com um método CreateProduct() que será implementado por sua filha.

Repare que quem faz uso do FactoryMethod é a própria classe Creator, mas esse método será implementado apenas pelo ConcreteCreator.

Uma consequência interessante da FactoryMethod tratada no livro é permitir a manipulação de hierarquias paralelas de classes. O exemplo dado é de elementos gráficos que possam ser manipulados (redimensionados, cortados, arrastados), como Linhas, Textos e Imagens.  Cada um desses objetos é manipulado diferentemente, mas através de uma mesma interface, a interface Manipulator.

Assim, você define na interface comum a esses produtos (no caso seria uma interface ElementosGráficos)  um método CreateManipulator. E a classe Linha irá criar um ManipuladorDeLinha, a classe Texto um ManipuladorDeTexto e a Imagem um ManipuladorDeImagem. Criando, dessa forma, as duas hierarquias paralelas: a de elementos gráficos e a de manipuladores desses elementos.