Buscar

POO-Aula-CreationalPatterns-V1

Prévia do material em texto

Paulo	
  Sérgio	
  dos	
  Santos	
  Júnior	
  
LEDS	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
Aula:	
  Conceitos	
  da	
  Orientação	
  a	
  Objetos	
  
	
  
	
  
Professor:	
  
E-­‐mail:	
  paulossjunior@ucl.br	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  A	
   maioria	
   dos	
   projeAstas	
   é	
   capaz	
   de	
   	
   compreender	
  
conceitos	
  como	
  classes,	
  objetos,	
  interfaces	
  e	
  herança;	
  
•  O	
   desafio	
   reside	
   em	
   aplicá-­‐los	
   para	
   construir	
   soJware	
  
flexível	
  e	
  reuAlizável;	
  
•  Os	
  projeAstas	
  experientes	
  sabem	
  que	
  não	
  se	
  deve	
  resolver	
  
todo	
   e	
   qualquer	
   problema	
   parAndo	
   de	
   princípios	
   básicos	
  
(classes,	
  objetos,	
  herança,	
  relacionamentos,	
  agregação,...);	
  
•  Devem	
   buscar	
   reuAlizar	
   soluções	
   que	
   funcionaram	
   no	
  
passado	
  (Padrão	
  de	
  Projeto,	
  Design	
  Pa*erns);	
  
PADRÕES	
  DE	
  PROJETO	
  
•  O	
   objeAvo	
   de	
   um	
   design	
   pa*ern	
   é	
   registrar	
   uma	
  
experiência	
   no	
   projeto	
   de	
   soJware	
   OO,	
   na	
   forma	
   de	
   um	
  
padrão	
   passível	
   de	
   ser	
   efeAvamente	
   uAlizado	
   por	
  
projeAstas.	
  
•  Um	
  projeAsta	
   familiarizado	
   com	
  padrões	
   de	
   projeto	
   pode	
  
aplicá-­‐los	
  diretamente	
  a	
  problemas	
  de	
  projeto	
  sem	
  ter	
  que	
  
redescobrir	
  abstrações	
  e	
  os	
  objetos	
  que	
  as	
  capturam.	
  	
  
•  Uma	
   vez	
   que	
   um	
   padrão	
   é	
   aplicado,	
   muitas	
   decisões	
   de	
  
projeto	
  decorrem	
  automaAcamente.	
  
PADRÕES	
  DE	
  PROJETO	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Padrão	
   Cria>vo:	
   abstrai	
   o	
   processo	
   de	
  
instanciação	
   (criação)	
   de	
   objetos,	
   ajudando	
   a	
  
tornar	
   um	
   sistema	
   independente	
   de	
   como	
   seus	
  
objetos	
  são	
  criados,	
  compostos	
  e	
  representados.	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Padrão	
   Cria>vo:	
   abstrai	
   o	
   processo	
   de	
  
instanciação	
   (criação)	
   de	
   objetos,	
   ajudando	
   a	
  
tornar	
   um	
   sistema	
   independente	
   de	
   como	
   seus	
  
objetos	
  são	
  criados,	
  compostos	
  e	
  representados.	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Padrão	
   Cria>vo:	
   abstrai	
   o	
   processo	
   de	
  
instanciação	
   (criação)	
   de	
   objetos,	
   ajudando	
   a	
  
tornar	
   um	
   sistema	
   independente	
   de	
   como	
   seus	
  
objetos	
  são	
  criados,	
  compostos	
  e	
  representados.	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Padrão	
  Estrutural:	
  diz	
   respeito	
  a	
  como	
  classes	
  e	
  
objetos	
   são	
   compostos	
   para	
   formar	
   estruturas	
  
maiores.	
  	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Padrão	
  Estrutural:	
  diz	
   respeito	
  a	
  como	
  classes	
  e	
  
objetos	
   são	
   compostos	
   para	
   formar	
   estruturas	
  
maiores.	
  	
  
	
  H	
  +	
  H+	
  O	
  à	
  ?	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Padrão	
  Estrutural:	
  diz	
   respeito	
  a	
  como	
  classes	
  e	
  
objetos	
   são	
   compostos	
   para	
   formar	
   estruturas	
  
maiores.	
  	
  
	
  H	
  +	
  H+	
  O	
  à	
  	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Padrão	
   Comportamental:	
   diz	
   respeito	
   a	
  
algoritmos	
  e	
  a	
  atribuição	
  de	
   	
  responsabilidades	
  e	
  
comportamentos	
  entre	
  objetos.	
  	
  
Exemplo	
  U>lizado	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Contexto:	
  
–  Desenvolver	
  um	
  sistema	
  para	
  a	
  Foobar	
  Motor	
  Company;	
  
–  A	
  Foobar	
  Motor	
  Company	
  fabrica:	
  
•  Carros;	
  
•  Vans;	
  
•  Motores	
  dos	
  veículos;	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Diagrama	
  de	
  classes:	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Princípios	
  comuns	
  de	
  padrões	
  de	
  projeto:	
  
1.  Programe	
   para	
   uma	
   interface	
   e	
   não	
   para	
   uma	
  
implementação;	
  
2.  Prefira	
  fazer	
  composição	
  de	
  objetos	
  do	
  que	
  herança;	
  
3.  Mantenha	
  baixo	
  acoplamento	
  entre	
  os	
  objetos;	
  
4.  Realize	
   encapsulamento	
   para	
   caracterísAcas	
   que	
  
mudam;	
  
PADRÕES	
  CRIATIVOS	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Padrões	
  CriaAvos:	
  
–  Fabrica	
   Abstrata:	
   prover	
   uma	
   interface	
   para	
   criar	
   uma	
   família	
   de	
  
objetos	
  sem	
  especificar	
  as	
  classes	
  concretas;	
  
	
  
–  Builder:	
   permite	
   criar	
   diversos	
   objetos	
   semelhantes,	
   uAlizando	
   o	
  
mesmo	
  algoritmo;	
  
–  Método	
   Fabrica:	
   define	
   uma	
   interface	
   para	
   criar	
   um	
   objeto,	
   mas	
  
“deixa”	
  a	
  decisão	
  de	
  instanciação	
  para	
  as	
  subclasses;	
  
–  Protó>po:	
  especifica	
  os	
  Apos	
  de	
  objetos	
  que	
  serão	
  criados	
  através	
  de	
  
protóApos	
  e	
  cria	
  um	
  novo	
  objeAvo	
  copiando	
  um	
  protóApo;	
  	
  
–  Singleton:	
   garante	
   que	
   apenas	
   um	
   objeto	
   será	
   criado	
   e	
   prover	
   um	
  
único	
  ponto	
  de	
  acesso	
  para	
  a	
  esse	
  objeto;	
  
PADRÕES	
  CRIATIVOS	
  
Fabrica	
  Abstrata	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Fabrica	
  Abstrata:	
  
–  Proposito:	
  prover	
  uma	
  interface	
  para	
  criar	
  uma	
  família	
  de	
  
objetos	
  sem	
  especificar	
  as	
  classes	
  concretas;	
  
–  Problema:	
  
•  A	
  Foobar	
  Motor	
  Company	
  fabrica	
  os	
  carros	
  e	
  vans	
  com	
  
a	
  lateria,	
  chassi	
  e	
  janelas.	
  	
  
•  Embora	
  os	
  carros	
  e	
  vans	
  precisem	
  dos	
  mesmo	
  Apos	
  de	
  
componentes,	
   a	
   especificação	
   de	
   cada	
   Apo	
   difere	
   do	
  
Apo	
  de	
  veiculo;	
  	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Fabrica	
  Abstrata:	
  
–  Para	
   construirmos	
   um	
   veiculo	
   devemos	
   pensar	
   que	
   os	
  
componentes	
  possuem	
  diferentes	
  “famílias”!	
  
	
  	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Fabrica	
  Abstrata:	
  
–  Para	
   construirmos	
   um	
   veiculo	
   devemos	
   pensar	
   que	
   os	
  
componentes	
  possuem	
  diferentes	
  “famílias”!	
  
	
  	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Fabrica	
  Abstrata:	
  
	
  	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Fabrica	
  Abstrata:	
  
	
  	
  
	
  
	
  
	
  
	
  
	
  
–  Como	
  iremos	
  instanciar	
  a	
  família	
  correta	
  de	
  componentes	
  
sem	
  explicitar	
  os	
  componentes	
  para	
  o	
  cliente?	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Fabrica	
  Abstrata:	
  
–  Como	
  iremos	
  instanciar	
  a	
  família	
  correta	
  de	
  componentes	
  
sem	
  explicitar	
  os	
  componentes	
  para	
  o	
  cliente?	
  
•  R.:	
  Através	
  de	
  uma	
  “fabrica”	
  de	
  classes!	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Fabrica	
  Abstrata:	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Fabrica	
  Abstrata:	
  
Fabrica	
  Abstrata	
  
Fabrica	
  dos	
  Van!	
  Fabrica	
  de	
  Carros!	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Fabrica	
  Abstrata:–  A	
  Classe	
  AbstractVehicleFactory	
  é	
  a	
  responsável	
  por	
  definir	
  
os	
   métodos :	
   c reateBody( ) ,	
   c reateChass i s ( )	
   e	
  
createWindows();	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Fabrica	
  Abstrata:	
  
–  A	
   Classe	
   CarFactory	
   é	
   a	
   responsável	
   por	
   retornar	
   os	
  
objeAvo	
  da	
  família	
  do	
  Apo	
  carro.	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Fabrica	
  Abstrata:	
  
–  A	
   Classe	
   VanFactory	
   é	
   a	
   responsável	
   por	
   retornar	
   os	
  
objeAvo	
  da	
  família	
  do	
  Apo	
  Van.	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Fabrica	
  Abstrata:	
  
–  Como	
  eu	
  uso	
  isso	
  em	
  código?	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Fabrica	
  Abstrata:	
  
–  Como	
  eu	
  uso	
  isso	
  em	
  código?	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Vantagens	
  e	
  Desvantagens	
  
–  Ele	
  isola	
  as	
  classes	
  concretas.	
  	
  
•  O	
  padrão	
  Abstract	
  Factory	
  ajuda	
  a	
  controlar	
  as	
  classes	
  de	
  objetos	
  criadas	
  
por	
  uma	
  aplicação.	
  Uma	
  vez	
  que	
  a	
  fábrica	
  encapsula	
  a	
  responsabilidade	
  e	
  
o	
   processo	
   de	
   criar	
   objetos,	
   isola	
   os	
   clientes	
   das	
   classes	
   de	
  
implementação.	
   Os	
   clientes	
   manipulam	
   as	
   instâncias	
   através	
   das	
   suas	
  
interfaces	
  abstratas.	
  Nomes	
  de	
  classes	
  ficam	
   isolados	
  na	
   implementação	
  
da	
  fábrica	
  concreta.	
  
–  Ele	
  torna	
  fácil	
  a	
  troca	
  de	
  famílias	
  de	
  produtos.	
  
•  A	
   classe	
   de	
   uma	
   fábrica	
   concreta	
   aparece	
   apenas	
   uma	
   vez	
   numa	
  
aplicação,	
   isto	
   é,	
   quando	
   é	
   instanciada.	
   Isso	
   torna	
   fácil	
  mudar	
   a	
   fábrica	
  
concreta	
  que	
  uma	
  aplicação	
  usa.	
  Ela	
  pode	
  usar	
  diferentes	
  configurações	
  
de	
   objetos	
   simplesmente	
   trocando	
   a	
   fábrica	
   concreta.	
   Uma	
   vez	
   que	
   a	
  
fábrica	
   abstrata	
   cria	
   uma	
   família	
   completa	
   de	
   objetos,	
   toda	
   família	
   de	
  
objetos	
  muda	
  de	
  uma	
  só	
  vez.	
  	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Vantagens	
  e	
  Desvantagens	
  
–  Ela	
  promove	
  a	
  harmonia	
  entre	
  produtos.	
  	
  
•  Quando	
  objetos	
  numa	
  família	
  são	
  projetados	
  para	
  trabalharem	
  juntos,	
  é	
  
importante	
   que	
   uma	
   aplicação	
   use	
   objetos	
   de	
   somente	
   uma	
   família	
   de	
  
cada	
  vez.	
  Abstract	
  Factory	
  torna	
  fácil	
  assegurar	
  isso.	
  
–  É	
  di4cil	
  suportar	
  novos	
  6pos	
  de	
  produtos.	
  	
  
•  Estender	
   fábricas	
  abstratas	
  para	
  produzir	
  novos	
  Apos	
  de	
  produtos	
  não	
  é	
  
fácil.	
   Isso	
   se	
   deve	
   ao	
   fato	
   de	
   que	
   a	
   interface	
   de	
  Abstract	
   Factory	
  fixa	
   o	
  
conjunto	
   de	
   produtos	
   que	
   podem	
   ser	
   criados.	
   Suportar	
   novos	
   Apos	
   de	
  
produtos	
   exige	
   estender	
   a	
   interface	
   da	
   fábrica,	
   o	
   que	
   envolve	
  mudar	
   a	
  
classe	
  AbstractFactory	
  e	
  todas	
  as	
  suas	
  subclasses.	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Aplicabilidade	
  (	
  Quando	
  usar?)	
  
–  Um	
   sistema	
   deve	
   ser	
   independente	
   de	
   como	
   seus	
   produtos	
   são	
   criados,	
  
compostos	
  ou	
  representados;	
  
–  Um	
   sistema	
   deve	
   ser	
   configurado	
   como	
   um	
   produto	
   de	
   uma	
   família	
   de	
  
múlAplos	
  produtos;	
  
–  Uma	
   família	
   de	
   objetos	
   for	
   projetada	
   para	
   ser	
   usada	
   em	
   conjunto,	
   e	
   você	
  
necessita	
  garanAr	
  esta	
  restrição;	
  
–  Você	
   quer	
   fornecer	
   uma	
   biblioteca	
   de	
   classes	
   e	
   quer	
   revelar	
   somente	
   suas	
  
interfaces,	
  não	
  suas	
  implementações.	
  
	
  
PADRÕES	
  CRIATIVOS	
  
Builder	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Builder:	
  
–  Proposito:	
   permite	
   criar	
   diversos	
   objetos	
   semelhantes,	
  
uAlizando	
  o	
  mesmo	
  algoritmo;	
  
–  Problema:	
  
•  A	
   Foobar	
   Motor	
   Company	
   fabrica	
   os	
   carros	
   e	
   vans.	
  
Porém,	
   o	
   processo	
   de	
   construção	
   difere	
   em	
   detalhes	
  
para	
  cada	
  veiculo:	
  
–  Van:	
   possui	
   uma	
   cabine	
   e	
   uma	
   grande	
   área	
   de	
   carga	
  
reforçada;	
  
–  Saloon:	
   possui	
   uma	
   área	
   dos	
   passageiros	
   e	
   uma	
   área	
   de	
  
malas;	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Builder:	
  
–  Problema:	
  
•  A	
   Foobar	
   Motor	
   Company	
   fabrica	
   os	
   carros	
   e	
   vans.	
  
Porém,	
   o	
   processo	
   de	
   construção	
   difere	
   em	
   detalhes	
  
para	
  cada	
  veiculo:	
  
–  Van:	
   possui	
   uma	
   cabine	
   e	
   uma	
   grande	
   área	
   de	
   carga	
  
reforçada;	
  
–  Saloon:	
   possui	
   uma	
   área	
   dos	
   passageiros	
   e	
   uma	
   área	
   de	
  
malas;	
  
•  Como	
   construir	
   diferentes	
   carros	
   com	
   o	
   mesmo	
  
material	
  e	
  usando	
  o	
  mesmo	
  processo?	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Builder:	
  
–  O	
   padrão	
   Builder	
   facilita	
   a	
   construção	
   de	
   objetos	
  
complexos	
  da	
  seguinte	
  forma:	
  
1.  Separando	
   os	
   métodos	
   uAlizados	
   em	
   hierarquia	
   de	
  
Builder;	
  
2.  Usando	
   um	
   Director	
   (diretor)	
   que	
   especifica	
   quais	
  
etapas	
  são	
  requeridas	
  e	
  a	
  ordem;	
  
3.  Builder	
  retorna	
  o	
  objeto	
  construído;	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Builder:	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Builder:	
  
	
  
Builder!	
  
Diretor!	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Builder:	
  
–  VehicleBuilder	
   possui	
   todos	
   os	
  métodos	
   necessários	
   para	
  
construir	
  os	
  veículos;	
  
–  VehicleBuilder	
  também	
  possui	
  os	
  método	
  getVehicle()	
  que	
  
retorna	
  o	
  veículo	
  construído;	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Builder:	
  
–  CarBuilder	
  responsável	
  por	
  construir	
  as	
  partes	
  do	
  carro;	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Builder:	
  
–  CarBuilder	
  responsável	
  por	
  construir	
  as	
  partes	
  do	
  carro;	
  
	
  
Repare	
  que	
  o	
  método	
  	
  
buildReinforcedStorageArea()	
  	
  
não	
  foi	
  sobreescrito!	
  PQ?	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Builder:	
  
–  VanDirector	
   responsável	
   por	
   definir	
   o	
   passo-­‐a-­‐passo	
   do	
  
processo	
  da	
  construção	
  de	
  uma	
  Van;	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Builder:	
  
–  Como	
  eu	
  uso	
  isso	
  em	
  código?	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Builder:	
  
–  Como	
  eu	
  uso	
  isso	
  em	
  código?	
  
PADRÕES	
  DE	
  PROJETO	
  
Vantagens	
  e	
  Desvantagens	
  
	
  
–  Permite	
  variar	
  	
  representação	
  interna	
  de	
  um	
  produto:	
  
•  O	
   objeto	
   builderfornece	
   ao	
   diretor	
   uma	
   interface	
   abstrata	
   para	
   a	
  
construção	
  do	
  produto;	
  
•  A	
   interface	
  permite	
   ao	
   construtor	
  ocultar	
   a	
   representação	
  e	
   a	
   estrutura	
  
interna	
  do	
  produto;	
  
–  Isola	
  o	
  código	
  para	
  construção	
  e	
  representação:	
  
•  Melhora	
  a	
  modulariedade	
  pelo	
  encapsulamento	
  da	
  forma	
  com	
  um	
  objeto	
  
complexo	
  e	
  construído	
  e	
  representado;	
  
•  Os	
   clientes	
   nada	
   necessitam	
   saber	
   sobre	
   as	
   classes	
   que	
   definem	
   a	
  
estrutura	
  interna	
  do	
  produto;	
  
•  Cada	
  ConcreteBuilder	
  contém	
  todo	
  o	
  código	
  para	
  criar	
  e	
  montar	
  um	
  Apo	
  
de	
  produto	
  específico.	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
Vantagens	
  e	
  Desvantagens	
  
	
  
–  Oferece	
  um	
  controle	
  fino	
  sobre	
  o	
  processo	
  de	
  construção:	
  
•  Ao	
  contrário	
  de	
  padrões	
  de	
  criação	
  que	
  constroem	
  produtos	
  de	
  uma	
  só	
  
vez,	
  o	
  Builder	
  constrói	
  o	
  produto	
  passo	
  a	
  passo	
  sob	
  o	
  controle	
  do	
  diretor;	
  
•  Somente	
   quando	
   o	
   produto	
   está	
   terminado	
   o	
   diretor	
   o	
   recupera	
   o	
  
construtor;	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
	
  
•  Aplicabilidade	
  (	
  Quando	
  usar?)	
  
–  O	
  algoritmo	
  para	
  criação	
  de	
  um	
  objeto	
  complexo	
  deve	
  ser	
  independente	
  das	
  
partes	
  que	
  compõem	
  o	
  objeto	
  e	
  de	
  como	
  elas	
  são	
  montadas;	
  
–  O	
   processo	
   de	
   construção	
   deve	
   permiAr	
   diferentes	
   representações	
   par	
   ao	
  
objeto	
  que	
  é	
  construído.	
  
PADRÕES	
  CRIATIVOS	
  
Método	
  Fabrica	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Método	
  Fabrica:	
  
–  Proposito:	
   definir	
   uma	
   interface	
   para	
   criar	
   um	
   objeto,	
   mas	
  
deixar	
   as	
   subclasses	
   decidirem	
   que	
   classe	
   intanciar.	
   O	
   Factory	
  
Method	
  permite	
  adiar	
  a	
  instanciação	
  para	
  as	
  subclasses.	
  
–  Problema:	
  
•  Precisamos	
   instanciar	
   um	
   Apo	
   parAcular	
   de	
   veiculo	
   (por	
  
exemplo,	
  Coupe)	
  com	
  um	
  certa	
  frequência;	
  
•  Quero	
   que	
   uma	
   classe	
   seja	
   responsável	
   por	
   gerenciar	
   a	
  
instanciação;	
  
•  Como	
  faremos	
  isso?	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Método	
  Fabrica:	
  
	
  
Quero	
  um	
  método	
  	
  
que	
  retorne	
  	
  
uma	
  instância	
  	
  
dessas	
  classes!!	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Método	
  Fabrica:	
  
–  Definir	
  uma	
  interface	
  para	
  criar	
  um	
  objeto,	
  mas	
  deixar	
  as	
  
subclasses	
   decidirem	
   que	
   classe	
   intanciar.	
   O	
   Factory	
  
Method	
  permite	
  adiar	
  a	
  instanciação	
  para	
  as	
  subclasses.	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Método	
  Fabrica:	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Método	
  Fabrica:	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Método	
  Fabrica:	
  
	
  
Fabrica	
  de	
  Van!	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Método	
  Fabrica:	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Método	
  Fabrica:	
  
	
  
Fabrica	
  de	
  Carros!	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Método	
  Fabrica:	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Método	
  Fabrica:	
  
–  Existe	
  uma	
  variação	
  do	
  método	
  fabrica	
  chamado:	
  método	
  
fabrica	
  está>co.	
  
–  O	
  uso	
  dela	
  é	
  comum:	
  pois	
  não	
  é	
  necessário	
  instanciar	
  um	
  
classe	
  do	
  Apo	
  fabrica;	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Método	
  Fabrica:	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Método	
  Fabrica:	
  
	
  
UAlizando	
  método	
  fabrica	
  estáAco!	
  
UAlizando	
  método	
  fabrica	
  normal!	
  
PADRÕES	
  DE	
  PROJETO	
  
Vantagens	
  e	
  Desvantagens:	
  
	
  
–  Melhor	
  extensibilidade:	
  
•  Não	
  é	
  necessário	
  saber	
  a	
  classe	
  concreta	
  	
  do	
  objeto	
  para	
  criá-­‐lo.	
  
–  Obrigatoriedade	
  da	
  subclasse	
  fábrica:	
  
•  Não	
   é	
   possível	
   criar	
   somente	
   um	
   produto	
   novo	
   sem	
   fábrica	
   (exceto	
   no	
  
caso	
  do	
  	
  parametrizado)	
  
PADRÕES	
  DE	
  PROJETO	
  
	
  
•  Aplicabilidade	
  (	
  Quando	
  usar?)	
  
–  Uma	
  classe	
  não	
  pode	
  antecipar	
  a	
  classe	
  de	
  objetos	
  que	
  devem	
  criar;	
  
–  Uma	
   classe	
   quer	
   que	
   suas	
   subclasses	
   especifiquem	
   os	
   objetos	
   que	
  
criam;	
  
–  Classes	
   delegam	
   responsabilidade	
   para	
   uma	
   dentre	
   várias	
   classes	
  
subclasses	
   auxiliares,	
   e	
   você	
   quer	
   localizar	
   o	
   conhecimento	
   de	
   qual	
  
subclasses	
  auxiliar	
  que	
  é	
  a	
  delegada;	
  
PADRÕES	
  CRIATIVOS	
  
Protó>po	
  
PADRÕES	
  DE	
  PROJETO	
  
•  ProtóApo:	
  
–  Proposito:	
  especifica	
  os	
  Apos	
  de	
  objetos	
  que	
  serão	
  criados	
  
através	
   de	
   protóApos	
   e	
   cria	
   um	
   novo	
   objeAvo	
   copiando	
  
um	
  protóApo;	
  	
  
–  Problema:	
  
•  Imagine	
  que	
  seja	
  necessário	
  criar	
  um	
  carro	
  e	
  uma	
  van	
  
em	
   tempo	
   de	
   execução	
   e	
   da	
   maneira	
   mais	
   rápida	
  
possível.	
  Como	
  faremos	
  isso	
  ?	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  ProtóApo:	
  
–  Problema:	
  
•  Imagine	
  que	
  seja	
  necessário	
  criar	
  um	
  carro	
  e	
  uma	
  van	
  
em	
   tempo	
   de	
   execução	
   e	
   da	
   maneira	
   mais	
   rápida	
  
possível.	
  Como	
  faremos	
  isso	
  ?	
  
–  Uma	
  abordagem	
  que	
  melhora	
  a	
  instanciação	
  em	
  tempo	
  de	
  
execução	
  é	
  o	
  ProtóApo.	
  	
  
–  No	
  Java	
  a	
  técnica	
  que	
  mais	
  se	
  adequa	
  ao	
  padrão	
  ProtóApo	
  
é	
  o	
  clone();	
  
PADRÕES	
  DE	
  PROJETO	
  
•  ProtóApo:	
  
PADRÕES	
  DE	
  PROJETO	
  
•  ProtóApo:	
  
–  Modificação	
  na	
  Classe	
  AbstractVehicle	
  
PADRÕES	
  DE	
  PROJETO	
  
•  ProtóApo:	
  
–  Modificação	
  na	
  Classe	
  AbstractVehicle	
  
Método	
  responsável	
  por	
  clonar!	
  
PADRÕES	
  DE	
  PROJETO	
  
•  ProtóApo:	
  
–  Agora	
   devemos	
   criar	
   uma	
   classe	
   que	
   é	
   responsável	
   por	
  
gerenciar	
  as	
  instâncias:	
  VechileManager.	
  
PADRÕES	
  DE	
  PROJETO	
  
PADRÕES	
  DE	
  PROJETO	
  
Criando	
  os	
  clones!	
  
PADRÕES	
  DE	
  PROJETO	
  
•  ProtóApo:	
  
–  UAlizando	
  a	
  Classe	
  VehicleManager:	
  
PADRÕES	
  DE	
  PROJETO	
  
•  ProtóApo:	
  
–  É	
  necessário	
   instanciar	
   todas	
  as	
  classes	
  ao	
  mesmo	
  tempo	
  
para	
  realizar	
  o	
  clone	
  ?	
  
PADRÕES	
  DE	
  PROJETO	
  
•  ProtóApo:	
  
–  É	
  necessário	
   instanciar	
   todas	
  as	
  classes	
  ao	
  mesmo	
  tempo	
  
para	
  realizar	
  o	
  clone	
  ?	
  	
  
–  R.:	
  Não.	
  Podemos	
  fazeruma	
  instanciação	
  tardia.	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Aplicabilidade	
  (	
  Quando	
  usar?)	
  
–  Use	
  o	
  padrão	
  Prototype	
  quando	
  o	
  seu	
  sistema	
  Aver	
  que	
  ser	
  independente	
  de	
  como	
  
os	
  seus	
  produtos	
  são	
  criados,	
  compostos	
  e	
  representados;	
  e:	
  
•  Quando	
   as	
   classes	
   a	
   instanciar	
   forem	
   especificadas	
   em	
   tempo	
   de	
   execução,	
  
por	
  exemplo,	
  por	
  carga	
  dinâmica;	
  
•  Para	
  evitar	
  a	
   construção	
  de	
  uma	
  hierarquia	
  de	
  classes	
  de	
   fábricas	
  paralela	
  à	
  
hierarquia	
  de	
  classes	
  de	
  produto;	
  
•  Quando	
   as	
   instâncias	
   de	
   uma	
   classe	
   puderem	
   ter	
   uma	
   dentre	
   poucas	
  
combinações	
   diferentes	
   de	
   estados.	
   Pode	
   ser	
  mais	
   conveniente	
   instalar	
   um	
  
número	
   correspondente	
   de	
   protóApos	
   e	
   cloná-­‐los,	
   ao	
   invés	
   de	
   instanciar	
   a	
  
classe	
  manualmente,	
  cada	
  vez	
  com	
  um	
  estado	
  apropriado	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Vantagens:	
  
–  Acrescentar	
  e	
  remover	
  produtos	
  em	
  tempo	
  de	
  execução:	
  
•  Permite	
   	
   adicionar	
   um	
   nova	
   classe	
   concreta	
   de	
   produto	
   a	
   um	
   sistema,	
  
simplesmente	
   registrando	
   uma	
   instância	
   protóApo	
   com	
   o	
   cliente.	
   Assim,	
   o	
  
cliente	
  pode	
  adicionar	
  e	
  remover	
  protóApo	
  em	
  tempo	
  de	
  execução;	
  
–  Especifica	
  novos	
  objetos	
  pela	
  variação	
  de	
  valores:	
  
•  Sistemas	
   altamente	
   dinâmicos	
   permitem	
   definir	
   novos	
   comportamentos	
  
através	
   da	
   composição	
   de	
   objetos	
   –	
   por	
   exemplo,	
   pela	
   especialização	
   de	
  
valores	
  para	
  as	
  variáveis	
  de	
  um	
  objeto	
  –	
  e	
  não	
  pela	
  definição	
  de	
  novas	
  classes.	
  
Esse	
  Apo	
  de	
  projeto	
  permite	
  ao	
  usuário	
  definir	
  novas	
   “Classes”	
   sem	
   ter	
  que	
  
programar.	
  Por	
  exemplo,	
  no	
  editor	
  musical,	
  uma	
  classe	
  GraphicTool	
  pode	
  criar	
  
uma	
  variedade	
  ilimitada	
  de	
  objetos	
  músicas.	
  
–  Reduzir	
  o	
  número	
  de	
  subclasses:	
  	
  
•  O	
  padrão	
  Prototype	
  permite	
  clonar	
  um	
  protóApo	
  em	
  vez	
  de	
  pedir	
  um	
  método	
  
fábrica	
   para	
   constuir	
   um	
   novo	
   objeto.	
   Daí,	
   não	
   necessitar-­‐se	
   de	
   nenhuma	
  
hierarquia	
  de	
  classes;	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Desvantagens:	
  
–  O	
   principal	
   ponto	
   fraco	
   do	
   padrão	
   Prototype	
   é	
   que	
   cada	
   subclasse	
   de	
  
Prototype	
   deve	
   implementar	
   a	
   operação	
   clone,	
   o	
   que	
   pode	
   ser	
   discil.	
  
Problemas:	
  
•  Quando	
  a	
  estrutura	
  interna	
  de	
  uma	
  classe	
  é	
  complexa;	
  
•  Ou	
  quando	
  existe	
  referência	
  circular;	
  
	
  
PADRÕES	
  CRIATIVOS	
  
Singleton	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Singleton:	
  
–  Proposito:	
   garante	
   que	
   apenas	
   um	
   objeto	
   será	
   criado	
   e	
  
prover	
  um	
  único	
  ponto	
  de	
  acesso	
  para	
  a	
  esse	
  objeto;	
  
–  Problema:	
  
•  Os	
  carros	
  somente	
  podem	
  ter	
  um	
  único	
  serial;	
  
•  Querem	
  se	
  assegurar	
  que	
  existe	
  apenas	
  um	
  local	
  onde	
  
esse	
  serial	
  é	
  obAdo;	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Singleton:	
  
–  Como	
   garanAr	
   que	
   exista	
   apenas	
   uma	
   instância	
   de	
   uma	
  
classe?	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Singleton:	
  
–  Como	
   garanAr	
   que	
   exista	
   apenas	
   uma	
   instância	
   de	
   uma	
  
classe?	
  
–  R:	
  Na	
  abordagem	
  “tradicional”:	
  
•  cria	
  um	
  método	
  construtor	
  “private”;	
  
•  Prover	
   um	
   método	
   public	
   sta>c	
   para	
   retornar	
   um	
  
objeto	
  está6co	
  da	
  classe;	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Singleton:	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Singleton:	
  
	
  
Instância	
  está>ca	
  do	
  objeto	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Singleton:	
  
	
  
U>lizou	
  o	
  synchronized	
  para	
  concorrência	
  entre	
  
threads!	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Singleton:	
  
	
  
Construtor	
  privado!	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Singleton:	
  
–  “Executando”	
  o	
  singleton;	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Singleton:	
  
–  Será	
   que	
   existe	
   um	
   modo	
   mais	
   elegante	
   de	
   aplicar	
   o	
  
padrão	
  singleton?	
  
	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Singleton:	
  
–  Será	
   que	
   existe	
   um	
   modo	
   mais	
   elegante	
   de	
   aplicar	
   o	
  
padrão	
  singleton?	
  
–  R.:	
  No	
  Java	
  1.5	
  é	
  feito	
  através	
  de	
  ENUM.	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Singleton:	
  
–  Será	
   que	
   existe	
   um	
   modo	
   mais	
   elegante	
   de	
   aplicar	
   o	
  
padrão	
  singleton?	
  
–  R.:	
  No	
  Java	
  1.5	
  é	
  feito	
  através	
  de	
  ENUM.	
  
–  COMO??	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Singleton:	
  
Como	
  eu	
  uso	
  isso?	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Singleton:	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Singleton:	
  
–  Problema:	
   A	
   Foobar	
   motor	
   quer	
   usar	
   um	
   idenAficador	
  
único	
  para	
  os	
  motores	
  também.	
  	
  
–  Como	
  faremos	
  o	
  código	
  sem	
  precisar	
  criar	
  uma	
  classe	
  com	
  
o	
  padrão	
  Siglenton	
  para	
  o	
  numerador	
  do	
  motor?	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Singleton:	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Singleton:	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Vantagens	
  e	
  Desvantagens:	
  
–  Acesso	
  controlado	
  à	
  instância	
  única:	
  
•  Como	
  a	
  classe	
  Singleton	
  encapsula	
  a	
  sua	
  única	
  instância,	
  possui	
  controle	
  total	
  sobre	
  
como	
  e	
  quando	
  os	
  clientes	
  a	
  acessam.	
  
–  Espaço	
  de	
  nomes	
  reduzidos:	
  
•  Representa	
   uma	
   melhoria	
   em	
   relação	
   ao	
   uso	
   de	
   varáveis	
   globais.	
   Ela	
   evita	
   a	
  
poluição	
   do	
   espaço	
   de	
   nomes	
   com	
   variáveis	
   globais	
   que	
   armazenam	
   instâncias	
  
únicas.	
  
–  Permi>r	
  refinamento	
  de	
  operações	
  e	
  da	
  representação:	
  
•  A	
  classe	
  singleton	
  pode	
  ter	
  subclasses;	
  
–  Permi>r	
  um	
  número	
  variavel	
  de	
  instâncias:	
  	
  
•  O	
  padrão	
  singleton	
  torna	
  fácil	
  mudar	
  de	
  idéia,	
  permiAndo	
  mais	
  de	
  uma	
  instância	
  da	
  
classe	
   Singleton.	
   Pode	
   uAlizar	
   a	
  mesma	
   abordagem	
   para	
   controlar	
   o	
   número	
   de	
  
instâncias	
   que	
   aplicação	
   uAliza.	
   Somente	
   a	
   operação	
   que	
   permite	
   acesso	
   à	
  
instância	
  de	
  Singleton	
  necessita	
  ser	
  mudada.	
  
PADRÕES	
  DE	
  PROJETO	
  
•  Aplicabilidade(	
  Quando	
  usar?)	
  
–  Use	
  o	
  padrão	
  Singleton	
  quando:	
  
•  For	
  preciso	
  haver	
  apenas	
  uma	
   instância	
  de	
  uma	
  classe,	
  e	
  essa	
   instância	
  Aver	
  que	
  
dar	
  acesso	
  aos	
  clientes	
  através	
  de	
  um	
  ponto	
  bem	
  conhecido;	
  
•  A	
  única	
   instância	
  Aver	
  de	
   ser	
   extensível	
   através	
  de	
   subclasses,	
   possibilitando	
  aos	
  
clientes	
  usar	
  instâncias	
  estendidas	
  sem	
  alterar	
  o	
  seu	
  código.	
  	
  
Licença	
  para	
  Uso	
  e	
  Distribuição	
  
• Este	
  material	
  está	
  disponível	
  para	
  uso	
  não-­‐comercial	
  e	
  pode	
  ser	
  derivado	
  e/
ou	
  distribuído,	
  desde	
  que	
  uAlizando	
  uma	
  licença	
  equivalente.	
  
• Maiores	
   informações:	
   hup://creaAvecommons.org/licenses/by-­‐nc-­‐sa/2.5/
deed.pt	
  
	
  
• Você	
   pode	
   copiar,	
   distribuir,	
   exibir	
   e	
   executar	
   a	
   obra,	
   além	
   de	
   criar	
   obras	
  
derivadas,	
   sob	
   as	
   seguintes	
   condições:	
   (a)	
   você	
   deve	
   dar	
   crédito	
   ao	
   autor	
  
original,	
  da	
   forma	
  especificada	
  pelo	
  autor	
  ou	
   licenciante;	
   (b)	
  você	
  não	
  pode	
  
uAlizar	
  esta	
  obra	
  com	
  finalidades	
  comerciais;	
  (c)	
  Se	
  você	
  alterar,	
  transformar,	
  
ou	
   criar	
  outra	
  obra	
   com	
  base	
  nesta,	
   você	
   somente	
  poderá	
  distribuir	
   a	
  obra	
  
resultante	
  sob	
  uma	
  licença	
  idênAca	
  a	
  esta.	
  
	
  
Referências	
  
	
  
▫  Freeman,	
   Freeman.	
   Use	
   a	
   Cabeça!	
   Padrões	
   de	
   Projeto.	
  
Segunda	
  Edição.2009.	
  Capítulo	
  4	
  e	
  5	
  
▫  Gamma,	
  E.,	
  Helm,	
  R.	
  JonhSon	
  ,	
  Ralph	
  e	
  Vlissides,	
  J.	
  Padrões	
  de	
  
Projeto:	
  Soluções	
  reuAlizáveis	
  de	
  soJware	
  orientado	
  a	
  objetos.	
  
Capitulo	
  3:	
  Padrões	
  de	
  Criação.

Continue navegando