Вы находитесь на странице: 1из 29

UNIVERSIDADE TECNOLGICA FEDERAL DO PARAN

PR

DESIGN PATTERNS PARTE 4: PADRES FACTORY E DAO

PROF. CESAR AUGUSTO TACLA UTFPR/Campus Curitiba


http://www.pessoal.utfpr.edu.br/tacla

PROF. CESAR A. TACLA UTFPR/CURITIBA

AGENDA
Antes de apresentar o DAO, veremos o padro FACTORY frequentemente utilizado em conjunto com DAO. Para entender o modelo DAO, faremos um breve introduo ao padro. Em seguida, implementaremos o modelo num programa simples de cadastro de clientes. Tpicos relacionados: Camada do modelo do padro MVC, banco de dados relacional

PROF. CESAR A. TACLA UTFPR/CURITIBA

PADRO DE CRIAO SIMPLE FACTORY

FBRICA SIMPLES

PROF. CESAR A. TACLA UTFPR/CURITIBA

FBRICA SIMPLES: PROBLEMA Exemplo motivador


Baixar o cdigo Factory/ExemploFactory Compilar e rodar Neste cdigo, h vrios tipos de pizzas. O cardpio evolui com o tempo, novas pizzas so adicionadas outras so retiradas. Os diversos tipos de pizza so instanciados na classe Main.
Pizza

Marguerita

Portuguesa

???

Responder as perguntas do prximo slide


PROF. CESAR A. TACLA UTFPR/CURITIBA

FBRICA SIMPLES: PROBLEMA


Exemplo extrado do livro Head First: Design Patterns O que fazer para suprimir uma pizza do cardpio ou adicionar novas? O que acontece se houver vrios pontos de instanciao destas pizzas? public class Main { public static void main(String args[]) { String e[] = new String[]{"MARGUERITA", "PORTUGUESA", "MARGUERITA"}; for (int i = 0; i < e.length; i++) { Pizza p=null; if (e[i].equalsIgnoreCase("MARGUERITA")) { p = new PizzaMarguerita(); } else if (e[i].equalsIgnoreCase("PORTUGUESA")) { p = new PizzaPortuguesa(); } System.out.println("=== INICIO PREPARACAO " + e[i] + " ==="); p.fazer(); p.embalar(); p.entregar(); } } }
5

PROF. CESAR A. TACLA UTFPR/CURITIBA

FBRICA SIMPLES: PROBLEMA Acoplamento


Observar que as classes clientes de Pizza devem conhecer as subclasses de Pizza (ex. classe Main). Mudanas na hierarquia (ex. nome das subclasses) provocam mudanas em todos os pontos de instanciao das pizzas.
Podem haver muitos pontos dependendo do tamanho do sistema
Pizza

Marguerita <<instancia>>

Portuguesa

???

<<instancia>> Main ???


PROF. CESAR A. TACLA UTFPR/CURITIBA

FBRICA SIMPLES: SOLUO

Encapsular a criao das Pizzas em um objeto SimpleFactory (ou fbrica simples) que sabe como criar objetos das subclasses da classe Pizza.
Desta maneira todo cdigo que for instanciar pizzas, utiliza a classe fbrica (ex. Pizzaria). Mudanas na hierarquia de Pizzas so absorvidas pela fbrica.
Pizza

Marguerita <<instancia>>

Portuguesa

???

<<instancia>> Pizzaria comunica-se Main


7

PROF. CESAR A. TACLA UTFPR/CURITIBA

FBRICA SIMPLES: SOLUO Baixar cdigo Factory/ExemploFactory2


Rascunhar um diagrama de classes para o cdigo em questo. Observar que somente a Fbrica conhece as Pizzas concretas Observar aonde foi parar o cdigo abaixo!!!
if (tipo.equalsIgnoreCase("MARGUERITA")) { p = new PizzaMarguerita(); } else if (tipo.equalsIgnoreCase("PORTUGUESA")) { p = new PizzaPortuguesa(); }

PROF. CESAR A. TACLA UTFPR/CURITIBA

PADRO DE CRIAO ABSTRACT FACTORY

FBRICA ABSTRATA

PROF. CESAR A. TACLA UTFPR/CURITIBA

FBRICA ABSTRATA

Situao problema:
H duas pizzarias, uma no Juvev e outra no Centro Os cardpios diferem nas pizzas oferecidas e no modo de preparao.
Por exemplo: No Juvev, tem pizza Calabresa (no Centro no) No Centro, Portuguesa assada por menos tempo e no leva azeitonas.

O sistema de pedido de pizzas centralizado, ento estes diferentes cardpios e modos de preparao devem ser levados em conta.

PROF. CESAR A. TACLA UTFPR/CURITIBA

10

FBRICA ABSTRATA: PROBLEMA O fbrica simples resolve o problema apenas para uma pizzaria
Para ter diferentes cardpios por pizzaria, teriamos que fazer duas fbricas
new PizzariaJuveve new PizzariaCentro

ainda assim, no poderiamos criar pizzas com receitas diferentes para as duas pizzarias, pois o mtodo criarPizza das Fbricas est atrelado s mesmas pizzas.
Ento teriamos que criar nova subclasse para a portuguesa especial do centro:
PortuguesaCentro

PROF. CESAR A. TACLA UTFPR/CURITIBA

11

FBRICA ABSTRATA: PROBLEMA

Pizza

Portuguesa

Calabresa

Marguerita

PortuguesaCentro <<instancia>>

<<instancia>> PizzariaJuvev PizzariaCentro

comunica-se Main

comunica-se

PROF. CESAR A. TACLA UTFPR/CURITIBA

12

ABSTRACT FACTORY Baixar o cdigo Factory/ExemploFactory3 para ver com resolver os problemas com o padro AbstractFactory Acrescentar uma nova Pizzaria que faz uma Pizza exclusiva de Presunto Rascunhar o diagrama de classes e comparar com o do SimpleFactory
Observar os mtodos criarFbrica e criarPizza

PROF. CESAR A. TACLA UTFPR/CURITIBA

13

FBRICA ABSTRATA: PROBLEMA

Pizza

Portuguesa

Calabresa

Marguerita

PortuguesaCentro <<instancia>>

<<instancia>> PizzariaJuvev PizzariaCentro <<instancia>> PizzariaAbstrata comunica-se Main

PROF. CESAR A. TACLA UTFPR/CURITIBA

14

FBRICA ABSTRATA: RESUMO Inteno


Prover uma interface para criar famlias de objetos sem especificar suas classes concretas

Aplicao
Quando o sistema deve ser independente de como os produtos so criados, compostos e representados O sistema deve ser configurado para trabalhar com diversas famlias de produtos Vale a pena utiliz-lo mesmo quando h apenas uma fbrica concreta? Sim, por causa do desacoplamento entre a famlia de produtos e o seu uso

PROF. CESAR A. TACLA UTFPR/CURITIBA

15

FBRICA ABSTRATA: PARTICIPANTES Participantes


AbstractFactory (Pizzaria) declara uma interface para criar produtos; os produtos so abstratos ConcreteFactory (PizzariaCentro, PizzariaJuveve): implementa as operaes para criar os produtos AbstractProduct (Pizza): declara uma interface para os produtos ConcreteProduct (Portuguesa, Marguerita): implementa a interface AbstractProduct e define produtos a serem criados pela fbrica concreta.

PROF. CESAR A. TACLA UTFPR/CURITIBA

16

FBRICA ABSTRATA: SOLUO

PRODUTO ABSTRATO Pizza PRODUTO CONCRETO Portuguesa Calabresa Marguerita PortuguesaCentro <<instancia>> PizzariaJuvev PizzariaCentro <<instancia>> PizzariaAbstrata FBRICA ABSTRATA FBRICA CONCRETA

<<instancia>>

comunica-se Main
17

PROF. CESAR A. TACLA UTFPR/CURITIBA

DATA ACCESS OBJECT

PADRO DAO

PROF. CESAR A. TACLA UTFPR/CURITIBA

18

PADRO DAO
DATA ACCESS OBJECT construir uma camada de acesso aos dados de forma a isolar a camada do modelo da camada de persistncia. Baixo acoplamento.
Classes do Modelo M1 BD
LDAP

Persistncia

M2

DAO

Mn

xml

PROF. CESAR A. TACLA UTFPR/CURITIBA

19

DAO: BENEFCIOS Pode-se mudar o mecanismo de persistncia a qualquer momento sem ter que modificar a camada do modelo.
Interessante para fazer nova distribuio de um sistema. Dois clientes diferentes de um sistema podem querer utilizar BDs diferentes

Pode-se utilizar vrios mecanismos de persistncia


ex. LDAP, BD, XML, arquivos, sistemas legados, de forma organizada, i.e. sem poluir a camada do modelo

PROF. CESAR A. TACLA UTFPR/CURITIBA

20

PADRO DAO DAO


abstrai e encapsula o acesso as fontes de dados. gerencia a conexo com a fonte e sabe como obter os dados.

Por exemplo,
encapsular conexes com o(s) BD(s) e os statements SQL

PROF. CESAR A. TACLA UTFPR/CURITIBA

21

PARTICIPANTES DAO Uma classe DAO factory


fbrica simples: instancia as diversas formas de persistncia

Interface DAO
produto abstrato:

Classe que implementa a interface DAO


produto concreto: uma classe para cada tipo de persistncia

Data transfer objects


tambm chamados de value objects

PROF. CESAR A. TACLA UTFPR/CURITIBA

22

EXEMPLO INICIAL DAO/ExemploDAO (no Repositrio Java)


A aplicao permite cadastrar e excluir registros da tabela CLIENTE. No h consistncia dos campos. A aplicao est preparada para gravar clientes no banco de dados JavaDB ou para serializar objetos em disco (na verdade, esta ltima opo no est implementada). Este exemplo no utiliza um objeto de transferncia de dados.

PROF. CESAR A. TACLA UTFPR/CURITIBA

23

EXEMPLO INICIAL DAO/ExemploDAO (no Repositrio Java) Para executar:


CRIAR BASE DE DADOS ====================== 1. Clique na tab servios 2. Clique direita em JavaDB > inicializar 3. Clique direita em JavaDB > criar BD 4. Nome do banco de dados: exemplodao_db Nome do usuario: APP Senha: APP Localizao: deixar o local default 5. Clicar direita na base recm criada > conectar 10. Na tabela CLIENTE, clique direita > visualizar dados 6. Para criar as tabelas, clicar direita na base recm criada > Executar comando... 7. Na tab Comando SQL i, copiar e colar o contedo do arquivo sqlcriacaotabela.txt 8. Clicar no cone RODAR SQL 9. Para visualizar o contedo da tabela CLIENTE, clicar na BD para que mostre as TABELAS

PROF. CESAR A. TACLA UTFPR/CURITIBA

24

EXEMPLO INICIAL: DIAGRAMA DE CLASSES


comunica-se ClienteDAO PRODUTO ABSTRATO

ClienteJAVADB <<instancia>> ClienteFabrica

ClienteSerial

PRODUTO CONCRETO

<<instancia>> FBRICA CONCRETA

comunica-se CtrlCadastro O CtrlCadastro pede Fbrica para instanciar uma das duas DAOs concretas. A partir da o controle interage de forma transparente com esta DAO, seja ela JAVADB ou Serializvel.
PROF. CESAR A. TACLA UTFPR/CURITIBA

25

EXERCCIO 1

PADRO D.A.O. APLICADO A CRUD


Implementar as operaes consultar e alterar na aplicao Implemente a operao inserir(Cliente) na classe ClienteSerial Observar que o controle uma composio de controles especficos para cada um dos CRUDs. Faa o diagrama de sequncia para o cenrio de incluso de um cliente. soluo em DAO/ExemploDAO-ConsAlt

CRUD (Create, Retrieve, Update e Delete)


PROF. CESAR A. TACLA UTFPR/CURITIBA

26

EXERCCIO 2

OBJETOS DE TRANSFERNCIA
Notar no exerccio anterior que no foram testadas excees tal como inexistncia de um cliente a ser excludo ou cliente j existente na incluso. H duas maneiras de resolver isto:
Lanar uma exceo e peg-la com try/catch; Utilizar um objeto de transferncia que serve ao DAO para comunicar este tipo de problemas ou outros dados ao objeto da camada do modelo. Este objeto tambm pode servir para que o objeto da camada do modelo se comunique com o DAO.

PROF. CESAR A. TACLA UTFPR/CURITIBA

27

EXERCCIO 2

Fazer
Na incluso, resolver o problema de cliente duplicado com lanamento de exceo
Cuidados: a exceo no pode ser especfica ao mecanismo de persistncia - por exemplo SQLException pois caso o modo de persistncia seja alterado esta exceo pode no fazer sentido.

Na consulta, excluso e alterao utilizar um objeto de transferncia que leve a mensagem ao objeto cliente da camada modelo soluo em DAO/ExemploDAO-Excecao

PROF. CESAR A. TACLA UTFPR/CURITIBA

28

DAO E CRUD interessante consultar a implementao do padro DAO para uma GUI CRUD pode ser encontrada em
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

Porm, observe que na implementao acima, no h separao entre GUI e controle. Os dois esto juntos na GUI. No catlogo J2EE, h vrios exemplos de padres

PROF. CESAR A. TACLA UTFPR/CURITIBA

29

Вам также может понравиться