Baixe o app para aproveitar ainda mais
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.
Compartilhar