Vous êtes sur la page 1sur 28

Padres de Projeto de

Software Orientado a Objetos

Tpicos de Programao Orientada a Objetos


MAC 5759
Prof. Fabio Kon - IME/USP
1

Padres de Projeto de Software


OO

Tambm conhecidos como

Padres de Desenho de Software OO


ou simplesmente como Padres.

PadresdeProjeto

2/28

A Inspirao

A idia de padres foi apresentada por Christopher Alexander em


1977 no contexto de Arquitetura (de prdios e cidades):
Cada padro descreve um problema que ocorre repetidamente de
novo e de novo em nosso ambiente, e ento descreve a parte central
da soluo para aquele problema de uma forma que voc pode usar
esta soluo um milho de vezes, sem nunca implementa-la duas
vezes da mesma forma.

Livros

The Timeless Way of Building


A Pattern Language: Towns, Buildings, and Construction
serviram de inspirao para os desenvolvedores de software.

PadresdeProjeto

3/28

Catlogo de solues

Um padro encerra o conhecimento de uma pessoa muito


experiente em um determinado assunto de uma forma que
este conhecimento pode ser transmitido para outras pessoas
menos experientes.
Outras cincias (p.ex. qumica) e engenharias possuem
catlogos de solues.
Desde 1995, o desenvolvimento de software passou a ter o
seu primeiro catlogo de solues para projeto de software: o
livro GoF.
PadresdeProjeto

4/28

Gang of Four (GoF)

E. Gamma and R. Helm and R.


Johnson and J. Vlissides. Design
Patterns - Elements of Reusable
Object-Oriented Software.
Addison-Wesley, 1995.

PadresdeProjeto

5/28

Gang of Four (GoF)

Passamos a ter um vocabulrio comum para conversar sobre


projetos de software.
Solues que no tinham nome passam a ter nome.
Ao invs de discutirmos um sistema em termos de pilhas, filas,
rvores e listas ligadas, passamos a falar de coisas de muito mais
alto nvel como Fbricas, Fachadas, Observador, Estratgia, etc.
A maioria dos autores eram entusiastas de Smalltalk,
principalmente o Ralph Johnson.
Mas acabaram baseando o livro em C++ para que o impacto
junto comunidade de CC fosse maior. E o impacto foi enorme,
o livro vendeu centenas de milhares de cpias.
PadresdeProjeto

6/28

O Formato de um padro

Todo padro inclui

Nome
Problema
Soluo
Conseqncias / Foras

Existem outros tipos de padres mas na aula de hoje


vamos nos concentrar no GoF.
PadresdeProjeto

7/28

O Formato dos padres no GoF

Nome (inclui nmero da pgina)

Objetivo / Inteno
Tambm Conhecido Como
Motivao

uma representao grfica da estrutura de classes do padro


(usando OMT91) em, s vezes, diagramas de interao (Booch 94)

Participantes

como reconhecer as situaes nas quais o padro aplicvel

Estrutura

um cenrio mostrando o problema e a necessidade da soluo

Aplicabilidade

um bom nome essencial para que o padro caia na boca do povo

as classes e objetos que participam e quais so suas responsabilidades

Colaboraes

como os participantes colaboram para exercer as suas responsabilidades

PadresdeProjeto

8/28

O Formato dos padres no GoF

Conseqncias

Implementao

no caso do GoF, em C++ (a maioria) ou Smalltalk

Usos Conhecidos

com quais detalhes devemos nos preocupar quando implementamos o


padro
aspectos especficos de cada linguagem

Exemplo de Cdigo

vantagens e desvantagens, trade-offs

exemplos de sistemas reais de domnios diferentes onde o padro


utilizado

Padres Relacionados

quais outros padres devem ser usados em conjunto com esse


quais padres so similares a este, quais so as dierenas

PadresdeProjeto

9/28

Tipos de Padres de Projeto

Categorias de Padres do GoF


Padres de Criao
Padres Estruturais
Padres Comportamentais

Vamos ver um exemplo de cada um deles.

Na aula de hoje:

Fbrica Abstrata (Abstract Factory (87))


- padro de Criao de objetos

PadresdeProjeto

10/28

Fbrica Abstrata
Abstract Factory (87)
Objetivo:
prover uma interface para criao de famlias de
objetos relacionados sem especificar sua classe
concreta.

PadresdeProjeto

11/28

Abstract Factory

- Motivao

Considere uma aplicao com interface grfica que implementada para


plataformas diferentes (Motif para UNIX e outros ambientes para
Windows e MacOS).
As classes implementando os elementos grficos no podem ser
definidas estaticamente no cdigo. Precisamos de uma implementao
diferente para cada ambiente. At em um mesmo ambiente, gostaramos
de dar a opo ao usurio de implementar diferentes aparncias (lookand-feels).
Podemos solucionar este problema definindo uma classe abstrata para
cada elemento grfico e utilizando diferentes implementaes para cada
aparncia ou para cada ambiente.
Ao invs de criarmos as classes concretas com o operador new,
utilizamos uma Fbrica Abstrata para criar os objetos em tempo de
execuo.
O cdigo cliente no sabe qual classe concreta utilizamos.

PadresdeProjeto

12/28

Abstract Factory -

Aplicabilidade

Use uma fbrica abstrata quando:

um sistema deve ser independente da forma como


seus produtos so criados e representados;
um sistema deve poder lidar com uma famlia de
vrios produtos diferentes;
voc quer prover uma biblioteca de classes de
produtos mas no quer revelar as suas
implementaes, quer revelar apenas suas interfaces.
PadresdeProjeto

13/28

Abstract Factory -

Estrutura

AbstractFactory

Client

CreatProductA()

AbstractProductA

CreatProductB()

ProductA2
ConcreteFactory1

ConcreteFactory2

CreatProductA()

CreatProductA()

CreatProductB()

CreatProductB()

ProductA1

AbstractProductB

ProductB2

PadresdeProjeto

ProductB1

14/28

Abstract Factory

Participantes

AbstractFactory (WidgetFactory)
ConcreteFactory (MotifWidgetFactory,
WindowsWidgetFactory)
AbstractProduct (Window, ScrollBar)
ConcreteProduct (MotifWindow,
MotifScrollBar, WindowsWindow,
WindowsScrollBar)
Client - usa apenas as interfaces declaradas pela
AbstractFactory e pelas classes AbstratProduct
PadresdeProjeto

15/28

Abstract Factory -

Colaboraes

Normalmente, apenas uma instncia de


ConcreteFactory criada em tempo de execuo.

Esta instncia cria objetos atravs das classes


ConcreteProduct correspondentes a uma famlia de
produtos.

Uma AbstractFactory deixa a criao de objetos para


as suas subclasses ConcreteFactory.
PadresdeProjeto

16/28

Abstract Factory -

Conseqncias

O padro
1. isola as classes concretas dos clientes;
2. facilita a troca de famlias de produtos (basta
trocar uma linha do cdigo pois a criao da fbrica
concreta aparece em um nico ponto do programa);
3. promove a consistncia de produtos (no h o
perigo de misturar objetos de famlias diferentes);
4. dificulta a criao de novos produtos
ligeiramente diferentes (pois temos que modificar
a fbrica abstrata e todas as fbricas concretas).
PadresdeProjeto

17/28

Abstract Factory 1.
2.

3.

Implementao

Fbricas abstratas em geral so implementadas como


(127).
Na fbrica abstrata, cria-se um mtodo fbrica para cada tipo de
produto. Cada fbrica concreta implementa o cdigo que cria os
objetos de fato.
Se tivermos muitas famlias de produtos, teramos um excesso de
classes fbricas concretas.
Para resolver este problema, podemos usar o Prototype (117):
criamos um dicionrio mapeando tipos de produtos em instncias
prototpicas destes produtos.
Ento, sempre que precisarmos criar um novo produto pedimos sua
instncia prototpica que crie um clone (usando um mtodo como
clone() ou copy()).

PadresdeProjeto

18/28

Abstract Factory 4.

5.

Implementao

Em linguagens dinmicas como Smalltalk onde classes so


objetos de primeira classe, no precisamos guardar uma instncia
prototpica, guardamos uma referncia para a prpria classe e da
utilizamos o mtodo new para construir as novas instncias.
Definindo fbricas extensveis.
normalmente, cada tipo de produto tem o seu prprio mtodo
fbrica; isso torna a incluso de novos produtos difcil.
soluo: usar apenas um mtodo fbrica

Product make (string thingToBeMade)

isso aumenta a flexibilidade mas torna o cdigo


menos seguro (no teremos verificao de tipos pelo
compilador).
PadresdeProjeto

19/28

Abstract Factory -

Exemplos de Cdigo

O GoF contm exemplos em C++ e Smalltalk

Na prxima aula veremos exemplos em


C++
Smalltalk
Java

e faremos uma comparao entre as implementaes nestas linguagens

PadresdeProjeto

20/28

Abstract Factory

Usos Conhecidos

InterViews usa fbricas abstratas para encapsular


diferentes tipos de aparncias para sua interface grfica
ET++ usa fbricas abstratas para permitir a fcil
portabilidade para diferentes ambientes de janelas
(XWindows e SunView, por exemplo)
Sistema de captura e reproduo de vdeo feito na UIUC
usa fbricas abstratas para permitir portabilidade entre
diferentes placas de captura de vdeo.
Em linguagens dinmicas como Smalltalk (e talvez em
POO em geral) classes podem ser vistas como fbricas
de objetos.
PadresdeProjeto

21/28

Abstract Factory -

Padres Relacionados

Fbricas abstratas so normalmente implementadas com


mtodos fbrica (FactoryMethod (107)) mas podem
tambm ser implementados usando Prototype (117).
O uso de prottipos particularmente importante em
linguagens no dinmicas como C++ e em linguagens
"semi-dinmicas" como Java.
Em Smalltalk, no to relevante.

Curiosidade: a linguagem Self no possui classes, toda


criao de objetos feita via clonagem.

Uma fbrica concreta normalmente um


Singleton (127)
PadresdeProjeto

22/28

Os 23 Padres do GoF

Criao

Abstract Factory
Builder
Factory Method
Prototype
Singleton

PadresdeProjeto

23/28

Os 23 Padres do GoF

Estruturais

Adapter
Bridge
Composite
Decorator
Faade
Flyweight
Proxy
PadresdeProjeto

24/28

Os 23 Padres do GoF

Comportamentais

Chain of Responsibility
Command
Interpreter
Iterator
Mediator
Memento

Observer
State
Strategy
Template Method
Visitor

PadresdeProjeto

25/28

Para prxima aula

Dar uma olhada no GoF

a biblioteca possui algumas cpias

Buscar por GoF patterns no google

PadresdeProjeto

26/28

Recapitulando

Voltando ao Christopher Alexander:


Cada padro descreve um problema que ocorre
repetidamente de novo e de novo em nosso ambiente, e ento
descreve a parte central da soluo para aquele problema de
uma forma que voc pode usar esta soluo um milho de
vezes, sem nunca implementa-la duas vezes da mesma forma.

Talvez a ltima parte no seja sempre desejvel.

PadresdeProjeto

27/28

Prximas Aulas

Exemplos de uso de Fbrica Abstrata em


C++
Java
Smalltalk

Demais padres do GoF

Outros tipos de padres


arquiteturais
de anlise
anti-padres
etc.

PadresdeProjeto

28/28

Vous aimerez peut-être aussi