dez 052007
 
Blz!
Dando continuidade aos post do “GoF[1]”, estou agora publicando o exemplo utilizando o padrão “Abstract Factory[2]”.

Observando o exemplo Abaixo (Veja exemplo anterior[3])

Podemos observar que o modelo proposto tem apenas quatro classes básicas (Verde Claro), e toda a criação do labirinto é feita pela classe “MazeGame”.
O padrão Abstract Factory, permite a criação de uma família de objetos relacionados sem especificar suas classes concretas, ou seja:
Vai definir uma classe base de uma fábrica, que possui os métodos de criação de um conjunto de objetos, os quais são baseados em um ponto genérico(classe base), onde permite assim que tanto a fábrica quanto os objetos a serem construídos sejam de classe que estendam a família de classe raíz.

Observando o diagrama de classe acima, podemos notar que:

  • Foi definida como fábrica base a classe “MazeFactory“, a qual define métodos para criação dos tipos básicos “Room“,”Door“,”Wall“;
  • Foi criada a classe “BombedWall” que estende a classe “Wall“;
  • Foi criada a classe “EnchantedDoor” que estende a classe “Door“;
  • Foram criadas as classe “RoomWithABomb” e “EnchantedRoom” que estendem a classe “Room“;
  • Foram criadas duas fábricas que estendem a classe “MazeFactory“, sendo elas “BombedMazeFactory” e “EnchantedMazeFactory“;
Como podemos observar a classe fábrica base é capaz de construir as peças básicas do labirinto, já a classe fábrica “BombedMazeFactory” é capaz de construir tudo que a classe “MazeFactory” faz, além de pela sobrecarga produzir objetos do tipo “RoomWithABomb” (subclasse de “Room“) e “BombedWall” (subclasse de “Wall“).
Onde para que o usuário desta classe consiga construir labirintos de um dos três tipos “Básicos”, “ComBomba” ou “Encantado” basta ele passar para a classe “MazeGame” um objeto do tipo de fábrica desejado, como podemos ver no exemplo abaixo:

// MazeFactory factory;
// EnchantedMazeFactory factory;
BombedMazeFactory factory;

Maze * aMaze = mazeGame.create(factory);

“Mudando apenas a instância da factory produzimos o que desejamos.”
Por final o resultado produzido é o apresentado na figura abaixo:


A melhor forma de entender os padrões é conhecendo sua finalidade e motivação, além de ver sua implementação, então não se esqueça de baixar o código deste exemplo e consultar os links de referência no final deste post.

Download[4]: http://downloads.sourceforge.net/pjmoo/GoF_AbstractFactory.zip

T+!
Vida Longa e Próspera!

———————————————-

Referência
[1]http://pt.wikipedia.org/wiki/Design_Patterns
[2]http://pt.wikipedia.org/wiki/Abstract_Factory
[3]http://davidferreira-fz.blogspot.com/2007/11/gof-exemplos.html
[4]http://downloads.sourceforge.net/pjmoo/GoF_AbstractFactory.zip
[5]http://pjmoo.wiki.sourceforge.net/GoF