Você está na página 1de 5

27/03/08 1

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.

a.k.a. virtual constructor


27/03/08 3
Factory Method

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

aplicabilidade (use Factory Method quando):


uma classe no pode antecipar a classe de objetos
que deve criar;
uma classe quer que suas subclasses
especifiquem os objetos que criam;
quiser localizar o conhecimento a respeito de
subclasses s quais so delegadas
responsabilidades especficas (em hierarquias de
classes paralelas)
27/03/08 6
Factory Method

aplicabilidade (hirarquias de classes paralelas)


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

Você também pode gostar