04/04/08 1
Tópicos Avançados em
Linguagem de Programação
Padrões de Projeto
Builder Pattern
Prof. Alexandre Vidal
DEINF-UFMA
Ciência da Computação
04/04/08 2Builder
Classificação:
−
Propósito: Criacional / Escopo: Objetos
−Padrão de Construção (intenção/Metsker)
Intenção:
−
separar a criação de um objeto complexo de sua
representação de modo que o mesmo processo de
construção possa criar diferentes representações.
04/04/08 3
Builder
Motivação:
−um leitor para documentos RTF (Rich Text Format) deve
poder converter o documento para diferentes formatos
−o número de formatos possíveis é aberto −portanto, é preciso facilitar a adição de uma nova
conversão sem modificar o leitor
−uma solução é configurar o RTFreader com um conversor,
para converter e representar o texto em um novo formato
−subclasses do conversor são especializadas em diferentes
conversões e formatos
04/04/08 4
Builder
Motivação:
−no padrão Builder:
o conversor é chamado builder
o leitor é chamado director
−o leitor é configurado com o builder
−o padrão separa o algoritmo para interpretação do
formato textual (no leitor)...
−do algoritmo que converte o formato lido em outro
formato, e que cria, compõe e representa esse novo formato (no builder)
04/04/08 5
Builder
Motivação:
04/04/08 6
Builder
Aplicabilidade ( quando usar o padrão ) :
−
quando o algoritmo para criação de um objeto
complexo deve ser independente das partes que o
compõem e de como elas são montadas
−
o processo de construção deve permitir diferentes
representações para o objeto construído
04/04/08 7
Builder
Estrutura
04/04/08 8Builder
Estrutura
04/04/08 9
Builder
Participantes
−
Builder:
especifica uma interface abstrata para criação de partes de um objeto-produto
−
ConcreteBuilder:
implementa a interface do Builder para construir e montar partes do produto
define e mantém a representação que cria
fornece interface para recuperação do produto
04/04/08 10
Builder
Participantes
−
Director:
constrói um objeto usando a interface do Builder
−
Product:
representa o objeto complexo em construção
inclui classes que que definem as partes constituintes, inclusive as interfaces para a montagem das partes no resultado final
04/04/08 11
Builder
Colaborações
−
o cliente cria o objeto Director e o configura com o
objeto Builder desejado
−
Director notifica o construtor sempre que uma
parte do produto deve ser construída
−
o cliente recupera o produto do construtor
04/04/08 12
Builder
Conseqüências
permite variar a representação interna de um
produto
isola o código para construção e representação
oferece controle mais fino sobre o processo de
04/04/08 13
Builder
Implementação (aspectos)
−
interface de montagem e construção:
um modelo que apenas agrega os novos construtos ao produto é, em geral, suficiente, mas às vezes é necessário acessar partes já agregadas ao produto −
porque não classes abstratas para produtos?
em geral, os produtos têm representações tão diferentes, que não há vantagens em ter uma superclasse comum
04/04/08 14
Builder
Implementação (aspectos)
−
Métodos vazios como default em Builder.
em C++, métodos build intencionalmente não são declarados virtuais puros
antes, são definidos como métodos vazios
os clientes sobrescrevem apenas as operações que lhes interessam 04/04/08 15
Builder
Exemplo de Código class MazeBuilder { public:virtual void BuildMaze() { } virtual void BuildRoom(int room) { }
virtual void BuildDoor(int roomFrom, int roomTo) { } virtual Maze* GetMaze() { return 0; }
protected: MazeBuilder(); }
04/04/08 16
Builder
podemos alterar a função CreateMaze para receber o builder como um parâmetro:
Maze* MazeGame::CreateMaze (MazeBuilder& builder) { builder.BuildMaze();
builder.BuildRoom(1); builder.BuildRoom(2); builder.BuildDoor(1, 2); return builder.GetMaze(); }
04/04/08 17
Builder
podemos reusar MazeBuilder para construir diferentes tipos de labirintos. A operação CreateComplexMaze é um exemplo: Maze* MazeGame::CreateComplexMaze (MazeBuilder&
builder) { builder.BuildRoom(1); // ... builder.BuildRoom(1001); return builder.GetMaze(); } 04/04/08 18
Builder
class StandardMazeBuilder : public MazeBuilder { public:
StandardMazeBuilder(); virtual void BuildMaze(); virtual void BuildRoom(int); virtual void BuildDoor(int, int); virtual Maze* GetMaze(); private:
Direction CommonWall(Room*, Room*); Maze* _currentMaze; };
04/04/08 19
Builder
void StandardMazeBuilder::BuildRoom (int n) { if (!_currentMaze->RoomNo(n)) { Room* room = new Room(n); _currentMaze->AddRoom(room); room->SetSide(North, new Wall); room->SetSide(South, new Wall); room->SetSide(East, new Wall); room->SetSide(West, new Wall); } }
04/04/08 20
Builder
void StandardMazeBuilder::BuildDoor (int n1, int n2) {
Room* r1 = _currentMaze->RoomNo(n1); Room* r2 = _currentMaze->RoomNo(n2); Door* d = new Door(r1, r2);
r1->SetSide(CommonWall(r1,r2), d); r2->SetSide(CommonWall(r2,r1), d); }
04/04/08 21
Builder
Clientes podem agora usar CreateMaze junto com StandardMazeBuilder para criar um labirinto: Maze* maze; MazeGame game; StandardMazeBuilder builder; game.CreateMaze(builder); maze = builder.GetMaze(); 04/04/08 22
Builder
Usos conhecidos−ver página 111 no GoF (traduzido);
Padrões Relacionados
−Abstract Factory
ênfase na construção de família de produtos (simples ou
complexos), enquanto Builder constrói um objeto complexo passo a passo;
O produto é devolvido imediatamente, enquanto Builder
devolve o produto como um passo final.
−Composite