Escolar Documentos
Profissional Documentos
Cultura Documentos
Factory Method
Factory Method
Tpicos Avanados em
Linguagem de Programao
Padres de Projeto
Factory Method
Prof. Alexandre Vidal
DEINF-UFMA
27/03/08 2
Factory Method
Classificao:
Propsito: Criacional
Escopo: Objetos
Inteno: Construo
Inteno:
define uma interface para criar um objeto, mas
deixa as subclasses decidirem que classes
instanciar.
Motivao
frameworks: considere um arcabouo para aplicaes
que pode apresentar mltiplos documentos para o
usurio
o arcabouo define duas classes abstratas:
Application e Document
o tipo de documento que a aplicao deve abrir
depende do tipo de aplicao
o arcabouo deve instanciar classes, mas s conhece
classes abstratas
27/03/08 4
Factory Method
Motivao
27/03/08 5
Factory Method
27/03/08 7
Factory Method
Estrutura
27/03/08 8
Factory Method
Participantes
Product: define a interface dos objetos criados pelo
mtodo fbrica;
ConcreteProduct: implementa a interface definida em
Product;
Creator: declara o mtodo fbrica (que retorna um
objeto do tipo Product;
ConcreteCreator: redefine o mtodo fbrica para
retornar uma instncia da classe ConcreteProduct.
27/03/08 9
Factory Method
Colaboraes
Creator depende de suas subclasses para definir o
mtodo fbrica que retorne uma instncia do
ConcretProduct apropriado
27/03/08 10
Factory Method
Conseqncias
o cdigo lida somente com a interface de Product
mais vantajoso quando Creator precisa ter
subclasses de qualquer maneira
conecta hierarquia de classes paralelas que
ocorrem quando uma classe delega algumas de
suas responsabilidades para uma classe separada
27/03/08 11
Factory Method
Implementao (alternativas)
Creator uma classe abstrata e no fornece
implementao para o mtodo fbrica;
Creator uma classe concreta e fornece
implementao por omisso (default) para o
mtodo fbrica;
mtodos fbrica parametrizados;
templates para evitar o uso de subclasses.
27/03/08 12
Factory Method
Exemplo de cdigo
class MazeGame {
public:
Maze* CreateMaze(); // builds and returns a maze
// factory methods:
virtual Maze* MakeMaze() const { return new Maze; }
virtual Room* MakeRoom(int n) const { return new Room(n); }
virtual Wall* MakeWall() const { return new Wall; }
virtual Door* MakeDoor(Room* r1, Room* r2) const
{ return new Door(r1, r2); } };
27/03/08 13
Factory Method
Maze* MazeGame::CreateMaze () { // implementando CreateMaze
Maze* aMaze = MakeMaze();
Room* r1 = MakeRoom(1);
Room* r2 = MakeRoom(2);
Door* theDoor = MakeDoor(r1, r2);
aMaze->AddRoom(r1);
aMaze->AddRoom(r2);
r1->SetSide(North, MakeWall());
r1->SetSide(East, theDoor);
r1->SetSide(South, MakeWall());
r1->SetSide(West, MakeWall());
r2->SetSide(North, MakeWall());
...
return aMaze; }
27/03/08 14
Factory Method
class BombedMazeGame : public MazeGame {
public:
BombedMazeGame();
virtual Wall* MakeWall() const { return new BombedWall; }
virtual Room* MakeRoom(int n) const { return new RoomWithABomb(n); } };
// An EnchantedMazeGame variant ...
class EnchantedMazeGame : public MazeGame {
public:
EnchantedMazeGame();
virtual Room* MakeRoom(int n) const { return new EnchantedRoom(n, CastSpell()); }
virtual Door* MakeDoor(Room* r1, Room* r2) const { return new DoorNeedingSpell(r1,r2); }
protected:
Spell* CastSpell() const; };
27/03/08 15
Factory Method
Usos conhecidos
ver pgina 120 no GoF (traduzido);
Padres Relacionados
Abstract Factory pode ser implementado usando o
Factory Method
Template Method costuma chamar Factory Methods
Prototype introduz um mtodo Initialize na classe
Creator do Factory Method