Factory Method. Edeyson Andrade Gomes www.edeyson.com.br



Documentos relacionados
Prototype, um Design Patterns de Criação

PADRÕES DE SOFTWARE. Jerffeson Teixeira de Souza, Ph.D. Tarciane de Castro Andrade. Grupo de Padrões de Software da UECE (GPS.

Profº. Enrique Pimentel Leite de Oliveira

Programação Orientada a Objetos Herança Técnico em Informática. Prof. Marcos André Pisching, M.Sc.

INF011 Padrões de Projeto. 02 Creational Patterns

Curso de PHP. FATEC - Jundiaí. A programação orientada a objetos (object-oriented oriented programming

Especificação do 3º Trabalho

Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO)

Padrões de Projeto. Singleton

Disciplina Técnicas de Modelagem

Módulo 07 Características Avançadas de Classes

Figura 1. A Classe Java

Técnicas de Programação II

EXERCÍCIOS SOBRE ORIENTAÇÃO A OBJETOS

Abstract Factory Pattern

Programação Orientada a Objetos Classes Abstratas Técnico em Informática. Prof. Marcos André Pisching, M.Sc.

Padrão Básico de Projeto: Interfaces e Polimorfismo

Computação II Orientação a Objetos

Programação Orientada a Objetos em Java. Herança

Programação com Objectos. Processamento de Dados I. 4. Classes Abstractas

Orientação a Objetos

PROGRAMAÇÃO ORIENTADA A OBJETO EM PHP

Classes Abstratas e Interfaces

PADRÕES DE PROJETO. Prof.: Jean Carlo Mendes

Tópicos em Engenharia de Computação

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

Programas eram lineares e com poucos módulos (Programação estruturada) Aumento da complexidade dos sistemas e difícil reusabilidade dos mesmos

Padrão Básico de Projeto: Herança versus Composição

Programação Orientada a Objetos (DPADF 0063)

ENGENHARIA DA COMPUTAÇÃO

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

PROGRAMAÇÃO AVANÇADA -CONCEITOS DE ORIENTAÇÃO A OBJETOS. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

Decorator Pattern. SISMO - Sistemas e Mobilidade Junho de Departamento de Informática / UFMA

Programação de Computadores - I. Profª Beatriz Profº Israel

Disciplina: Unidade III: Prof.: Período:

Pasteur Ottoni de Miranda Junior. Alguns Padrões de Projeto Gamma

Curso - Padrões de Projeto Módulo 2: Padrões de Criação

AULA 4 VISÃO BÁSICA DE CLASSES EM PHP

Orientação a Objetos

Universidade Federal de Uberlândia Faculdade de Computação Prof. Fabiano Azevedo Dorça Programação Orientada a Objetos II. Padrões de Projeto

Construção de novas Classes em Java. Classes Atributos Métodos Herança...

ATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS

UML - Unified Modeling Language

Material de Apoio 5. int getres() { return res; O que estas classes possuem em comum? 1) 2) 3)

Criar alertas de suprimentos e serviço

Análise e Projeto Orientados por Objetos

BANCO DE DADOS I AULA 3. Willamys Araújo

Um objeto é uma instância de uma 'classe'. Você define uma classe utilizando o trecho de código abaixo;

Introdução à Programação. Interface, Polimorfismo e Dynamic Binding

Java 2 Standard Edition Como criar classes e objetos

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

UML: Diagrama de Casos de Uso, Diagrama de Classes

Caso já seja usuário do SCAW siga as instruções a partir da página X.

Laboratório de ENGSOF Estudo de Caso. Prof. André Pereira, MSC, PMP

Máscaras de sub-rede. Fórmula

Herança. Alberto Costa Neto DComp - UFS

Programação por Objectos. Java

Reuso com Herança a e Composiçã

Orientação a Objetos com Java

UML Aspectos de projetos em Diagramas de classes

Relatório do GPES. Arquitetura Geral do Framework

Rock In Rio - Lisboa

Sumário. Uma visão mais clara da UML

Exercício 1 : As classes abaixo serão utilizadas neste exercício: public class Ponto { int x; int y; public Ponto(int x, int y){ this.

DESENVOLVIMENTO DE SOFTWARE. Introdução ao Visual Studio VB.Net. Programação Estruturada. Prof. Celso Candido ADS / REDES / ENGENHARIA

Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP

DEFINIÇÃO DE MÉTODOS

Feature-Driven Development

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

Programação de Computadores - I. Profª Beatriz Profº Israel

MANUAL DE UTILIZAÇÃO

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

Base de Dados para Administrações de Condomínios

Programação Orientada a Objeto

Programação Orientada a Objetos. Encapsulamento

*%# ## (+& ', # )&* ## - () ' #.# %&/.# ' '# () 0 *&# */ #,$1$ # * * ()% " ## # * 23 (), ) 45&26, ' 1#45 6'&#1#&# &7 ; '# *23) 8=9 =()/ / =:7

Planilha Eletrônica Excel

Programação Concorrente

Capítulo 14. Herança a e Polimorfismo. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Conteúdo. Disciplina: INF Engenharia de Software. Monalessa Perini Barcellos. Centro Tecnológico. Universidade Federal do Espírito Santo

SisResEv Sistema de Reserva de Salas para Eventos. Instruções de uso

LINGUAGEM DE PROGRAMAÇÃO WEB

Implementando uma Classe e Criando Objetos a partir dela

A apresentação através de fluxos lógicos consegue mostrar mal entendidos e pontos que são controversos.

1 Natuur Online Cadastre-se Nome, Login Cadastrar.

POO Programação Orientada a Objetos. Classes em Java

Desenvolvimento de Aplicações para Internet Aula 7

Relacionamentos entre classes

Manual Sistema Mó vel Msys Cómercial

Configurações de Templates no SolidWorks 2011

Programação Orientada a Objetos em java. Polimorfismo

Análise de Programação

Programação Orientada a Objetos. Padrões de Criação

1. Herança. Sobrescrevem métodos - redefinem métodos herdados. Subclasse herda de uma superclasse

Prof. Rafael Gross.

Primeiramente, vamos saber o que foi utilizado para a confecção do elevador, vamos listar as coisas utilizadas mais importantes:

Prova de Java. 1) Copie o programa abaixo no eclipse e complete-o, utilizando os conceitos aprendidos durante o curso. (4 pontos)

Sistema de Avaliação. Manual do Usuário

Transcrição:

Factory Method Edeyson Andrade Gomes www.edeyson.com.br

Agenda Resumo Quando Usar Participantes Colaborações Conseqüências Exemplo Estrutura Genérica Exercício 2

Resumo Ao invés do cliente instanciar objetos através da chamada a new, ficando acoplado com a classe concreta que ele instancia, ele chama um método de criação (FactoryMethod). 1. carro = new Carro() 2. O objeto carro é uma instância da classe concreta Carro. Isso está pré-determinado neste código. Exemplo Acoplado 3

Resumo Ao invés do cliente instanciar objetos através da chamada a new, ficando acoplado com a classe concreta que ele instancia, ele chama um método de criação (FactoryMethod). E se o objetivo é instanciar carro com uma classe concreta determinada em tempo de execução: 1. carro = criacarro() 2. O método criacarro pode criar um carro tendo como retorno um Carro Abstrato. Logo, criacarro concreto determina qual carro concreto criar. criacarro() é um Factory Method 4

Resumo Usando o Factory Method, uma classe cria um objeto pelo TIPO Abstrato e uma subclasse concreta sua determina qual a classe concreta do objeto a criar. public abstract Assento CriaAssento(); public Assento CriaAssento() { } return new AssentoMadeira() ; Mudar a subclasse concreta que cria o objeto permite mudar a classe do objeto criado 5

Quando Usar Quando uma classe (o criador) não pode antecipar a classe dos objetos que deve criar Quando uma classe quer que suas subclasses especifiquem os objetos criados 6

Participantes Produto Define a interface (o TIPO) dos objetos criados pelo Factory Method ICano ProdutoConcreto Implementa a interface Produto Cano da Tigre Criador Declara o Factory Method que retorna um objeto do tipo Produto Encanamento 7

Participantes Às vezes, o Criador não é abstrato Pode envolver uma classe concreta que tenha uma implementação padrão para o Factory Method para retornar um objeto com algum tipo ProdutoConcreto CriadorConcreto Faz override do Factory Method para retornar uma instância de ProdutoConcreto 8

Colaborações Criador depende de suas subclasses para definir o Factory Method para que ele retorne uma instância do ProdutoConcreto apropriado 9

Conseqüências Factory Method elimina a necessidade de colocar classes específicas da aplicação no código O código só lida com o TIPO Produto O código pode funcionar com qualquer classe ProdutoConcreto Provê ganchos para subclasses Criar objetos dentro de uma classe com um Factory Method é sempre mais flexível do que criar objetos diretamente O Factory Method provê um gancho para que subclasses forneçam uma versão estendida de um objeto 10

Exemplo 11

Estrutura Genérica 12

Exercício Deseja-se criar uma Casa que possua Salas, Quartos, Paredes e Portas, que podem ser construídas em Aço, Vidro ou Madeira. Casa de Aço possui Salas, Quartos, Paredes e Portas de Aço. O projeto inicial da Casa deve ter duas Salas e dois Quartos, com paredes com e sem porta, como apresenta a Figura 01. 13

Exercício Embora simplório, mas didático, o projeto em UML será o seguinte: PortaAB aberta : boolean nomeclasse : Logical View::java::lang::String abrir() fechar() estaaberta() entrar() ParedeAB nomeclasse : Logical View::java::lang::String ParedeAB() ParedeAB() entrar() #porta 0..1 -paredenorte -paredeoeste -paredeleste -paredesul -paredenorte -paredeoeste -paredeleste -paredesul QuartoAB nomeclasse : Logical View::java::lang::String SalaAB nomeclasse : Logical View::java::lang::String entrar() setparedenorte() setparedesul() setparedeleste() setparedeoeste() -quarto1 -quarto2 Casa Casa() entrar() setparedenorte() setparedesul() setparedeleste() setparedeoeste() -sala1 -sala2 14

Exercício Construir Casa de Madeira, de Vidro e de Aço com a estrutura da Figura 01 15

public class CasaMadeira { /* Atributos da Casa */ private QuartoAB quarto1, quarto2; private SalaAB sala1, sala2; /* O construtor CasaMadeira é responsável por determinar a estrutura da Casa e os * Objetos Concretos (de Madeira) a usar em sua construção. Note que Estrutura e * Objeto Concreto da construção estão Acoplados. */ public CasaMadeira() { PortaAB porta = new PortaMadeira(); ParedeAB parede = new ParedeMadeira(porta); sala1 = new SalaMadeira(); sala2 = new SalaMadeira(); quarto1 = new QuartoMadeira(); quarto2 = new QuartoMadeira(); sala1.setparedesul(parede); sala2.setparedenorte(parede); sala1.setparedenorte(new ParedeMadeira()); sala1.setparedeoeste(new ParedeMadeira()); O construtor CasaMadeira() determina TODO objeto concreto a usar através de NEW. Ou seja, todos os objetos concretos são de madeira.. } 16 } porta = new PortaMadeira(); parede = new ParedeMadeira(porta); sala2.setparedeoeste(parede); sala2.setparedesul(new ParedeMadeira()); porta = new PortaMadeira();...

Exercício Vale ressaltar que toda variável definida em CasaMadeira() é definida pelo TIPO ABSTRATO, não por um TIPO CONCRETO. Isso permite variar, no futuro, o tipo concreto a usar. Problemas com a solução: Deseja-se construir uma casa de Vidro com a mesma estrutura da Figura 01. Questão: O que será reusado do código da Casa de Madeira? Vamos à solução! 17

public class CasaMadeira { /* Atributos da Casa */ private QuartoAB quarto1, quarto2; private SalaAB sala1, sala2; public CasaMadeira() { PortaAB porta = new PortaMadeira(); ParedeAB parede = new ParedeMadeira(porta); sala1 = new SalaMadeira(); sala2 = new SalaMadeira(); quarto1 = new QuartoMadeira(); quarto2 = new QuartoMadeira(); sala1.setparedesul(parede); sala2.setparedenorte(parede); sala1.setparedenorte(new ParedeMadeira()); sala1.setparedeoeste(new ParedeMadeira()); porta = new PortaMadeira(); parede = new ParedeMadeira(porta); public class CasaVidro { /* Atributos da Casa */ private QuartoAB quarto1, quarto2; private SalaAB sala1, sala2; public CasaVidro() { PortaAB porta = new PortaVidro(); ParedeAB parede = new ParedeVidro (porta); sala1 = new SalaVidro(); sala2 = new SalaVidro(); quarto1 = new QuartoVidro(); quarto2 = new QuartoVidro(); sala1.setparedesul(parede); sala2.setparedenorte(parede); sala1.setparedenorte(new ParedeVidro()); sala1.setparedeoeste(new ParedeVidro()); porta = new PortaVidro(); parede = new ParedeVidro(porta); } 18 sala2.setparedeoeste(parede); sala2.setparedesul(new ParedeMadeira()); porta = new PortaMadeira();... } sala2.setparedeoeste(parede); sala2.setparedesul(new ParedeVidro()); porta = new PortaVidro();... } }

Exercício Deseja-se, agora, construir uma casa de Aço com a mesma estrutura da Figura 01. Questão: O que será reusado da Casa de Madeira ou Vidro? Vamos à solução (Eclipse) Problemas 1. Se a estrutura da Casa mudar, quantas classes temos de mudar? Resp: Mudar as três. 2. Se quisermos construir Casas de Aço, Madeira e Vidro com um quarto e uma sala, ou seja, uma nova estrutura, quantas classes novas necessitamos? Resp: Três (uma de Madeira, uma de Vidro e uma de Aço). Qual a solução a esses problemas? 19

Exercício Por que a solução está acoplada? Resp: Define-se a estrutura e a classe concreta do objeto concreto a usar através de NEW. Como deixar que em tempo de execução o objeto concreto seja determinado? Resp: usando métodos de criação. Ex. Usar TipoXAbstrato objetox = criaobjetox(); criaobjetox cria um objetox e retorna pelo TIPO. public TipoXAbstrato criaobjetox() {...} 20

Exercício Vamos para a solução desacoplada: Casa2S2Q - cria uma casa com duas Salas e Dois Quartos. Define a Estrutura sem determinar o objeto concreto. Casa2S2Q define a estrutura da casa. São os factory methods que vão determinar, nas subclasses de Casa2S2Q, via override, que objeto concreto criar. Vamos criar uma subclasse de Casa2S2Q para determinar os objetos concretos. Vamos criar uma casa de Madeira. Casa2S2QMadeira especializa Casa2S2Q e determina que os objetos concretos criados nos factory methods são de madeira. Vamos criar uma casa de Madeira com porta de Madeira Ornamentada. Casa2S2QMadeiraOrnamentada especializa Casa2S2QMadeira e determina que a porta é Ornamentada e os objetos concretos criados nos factory methods são de madeira, herdando de Casa2S2QMadeira. 21

Exercício Novas Questões 1.Se a estrutura da Casa mudar, quantas classes temos de mudar? Resp: Mudar somente uma, Casa2S2Q. 2. Se quisermos construir Casas com um quarto e uma sala, quantas classes necessitamos? Resp: Cinco (uma para construir a estrutura, uma subclasse de Madeira, uma subclasse de MadeiraOrnamentada, uma subclasse de Vidro e uma subclasse de Aço). Desafio: Construir Casas com um Quarto e uma Sala já usando o padrão Casa1S1Q no Eclipse 22

Exercício Vamos construir Casa de um Quarto e uma Sala de Madeira. Ao usar extends determinamos que estrutura vamos usar. Os Factory Methods determinam o que? Resp: Os objetos concretos a usar na construção da estrutura. Podemos notar que o código de Casa1S1QMadeira e Casa2S2QMadeira são idênticos. Podemos notar que o código de Casa1S1QAço e Casa2S2QAço são idênticos. 23

Exercício Note que para qualquer casa criada, com qualquer estrutura, suas subclasses serão iguais. Subclasses de Aço implementam os mesmos métodos, independendo da estrutura da Casa. Vamos tirar a responsabilidade de criar o objeto concreto da subclasse e colocar numa classe que é uma Fábrica de Objetos. Faremos Fábricas que constroem objetos de Aço para casas de aço, independendo de estrutura, Fábricas de Madeira, Vidro, etc. 24