Baixe o app para aproveitar ainda mais
Prévia do material em texto
AULA 02 PADRÕES DE CRIAÇÃO GOF Nesta aula, você irá: 1.Conhecer os padrões de criação Builder, Prototype e Singleton. 2.Aprender as pr inc ipa is ap l icações e funcionalides destes padrões. BUILDER O padrão de projeto Builder é utilizado na instanciação de objetos complexos. Portanto, in ic ia lmente, é preciso entender como caracterizar um objeto complexo. Um objeto é caracterizado como complexo quando ele é associado a outros objetos por qualquer tipo de relacionamento conhecido ou ainda quando ele apresenta atributos que são instanciados a partir de diferentes regras de negócio. Nestas circunstâncias, instanciar objetos não é trivial, diferentes condições e situações devem ser consideradas. O padrão Builder é bastante utilizado nestas situações, podendo ser visto como um construtor especializado, que irá executar e avaliar diferentes regras de negócio e demais particularidades relacionadas com a criação de PADRÕES DE PROJETO DE SOFTWARE 1 um novo ob je to . A ide ia é a t r ibu i r a responsabilidade de criação do objeto complexo a outra classe, esta classe irá armazenar todas as configurações e regras necessárias para a instanciação do novo objeto. Uma solução natural, apresentada por muitos desenvolvedores, é embutir no construtor da própria classe a lógica para criação de um objeto ou ainda distribuir a lógica de criação em vários métodos adicionais. Um dos principais objetivos do padrão Builder é evitar este tipo de estratégia, seu propósito é separar o algoritmo de criação de um objeto complexo tanto da especificação, quanto das partes que o compõem. Esta abordagem facilita a criação de objetos com diferentes configurações e representações, facilita a manutenção do código, reduz a complexidade das classes relacionadas (a complexidade de criação é atribuída ao Builder) e melhora a legibilidade da solução final, ou seja, para entender como um objeto é criado e sob quais condições, deve-se avaliar a classe Builder responsável por esta ação. EXEMPLIFICANDO BUILDER Como um exemplo, vamos considerar a necessidade de instanciar um objeto da uma PADRÕES DE PROJETO DE SOFTWARE 2 classe Pedido, a qual é formada por um conjunto de itens de pedido (Produtos) e por outros atributos específicos, tais como numero, data e vendedor. A imagem apresenta o diagrama de classes em UML com a solução proposta utilizando o padrão Builder. Inicialmente, foram projetadas as três classes básicas relacionadas com o problema: Produto, Pedido e Vendedor. Após, foi projetada a classe PedidoBuilder para realizar a instanciação de objetos Pedido. Para efeito de simplificação da interface da classe PedidoBuilder, todos os parâmetros necessários para instanciar uma classe Pedido foram agrupados no atributo parâmetros do tipo String. PADRÕES DE PROJETO DE SOFTWARE 3 PADRÕES DE PROJETO DE SOFTWARE 4 De acordo com a estrutura proposta, o método buildPedido é responsável por chamar cada método da classe Pedido e assim gerar um objeto completo, enquanto que o método getPedido retorna o objeto Pedido construído pelo método buildPedido. Observe que o método buildPedido realiza todas as chamadas necessárias para a criação completa de uma instância do objeto Pedido. Se por ventura, futuramente, a classe Pedido sofrer a lguma a l te ração , somente o método buildPedido da classe PedidoBuilder deverá ser alterado. A seqüência de comandos abaixo ilustra como é a criação de um objeto Pedido usando a classe pedidoBuilder. PADRÕES DE PROJETO DE SOFTWARE 5 … String configuracao; // informar todos os dados necessários PedidoBuilder builder; Pedido pedido; builder = new pedidoBuilder(configuracao); builder.buildPedido(); pedido = builder.getPedido(); // Listar atributos System.out.println(pedido.getNumero); … Comparando o diagrama de classe apresentado na imagem com a estrutura do padrão de projeto Builder proposta em Gamma et al. (2000), tem- se que a classe PedidoBuilder corresponde a ConcreteBuilder, Pedido corresponde a Product e Director será qualquer classe que utilizará o padrão Builder para instanciar objetos Pedido. A classe Builder especifica uma interface abstrata, definindo as operações básicas que devem ser implementadas pelas classes derivadas. Por fim, é importante destacar a diferença entre o padrão AbstractFactory, estudado na aula anterior, e o padrão Builder, pois ambos estão direcionados a criação de objetos. A principal diferença entre eles é que o Builder constrói PADRÕES DE PROJETO DE SOFTWARE 6 objetos complexos passo-a-passo, retira-se o algoritmo de criação do construtor da classe do objeto e criar-se uma nova classe com esta responsabilidade, enquanto que AbstractFactory constrói famílias de objetos relacionados, simples ou complexos, de uma só vez, primeiro instancia-se a família do objeto e a seguir o objeto propriamente dito. Prototype O padrão de projeto Prototype declara um método chamado clone na superclasse abstrata do modelo (Prototype). Em função desta declaração, cada classe concreta derivada deve ser capaz de gerar uma nova instância de si próprio, ou seja, um método especializado capaz de construir objetos iguais a si mesmo, também podendo ser chamado de clone. Entre as aplicações para este padrão de projeto estão a facilidade de instanciar classes em tempo de execução. Quando as instancias de uma classe apresentam poucas combinações de estados, pode ser mais conveniente definir previamente um conjunto de protótipos e cloná- los, sempre que foi necessário. Além disso, é bastante útil para guardar o estado de um objeto PADRÕES DE PROJETO DE SOFTWARE 7 em determinados momentos, nesses casos, basta pedir uma cópia do próprio objeto, ao invés de criar uma nova instancia manualmente. EXEMPLIFICANDO Prototype A imagem ilustra um exemplo de aplicação do padrão Prototype. A classe CarroClone é uma interface que declara o método clone, a ser implementado nas classes derivadas. Desse modo, a classe Carro implementa este método retornando uma nova instancia da classe a partir dos valores atuais dos seus atributos. A implementação deste padrão de projeto é facilitada na linguagem de programação Java com a utilização da interface Cloneable, utilizada apenas para indicar que o método Object.clone() pode realizar uma cópia, atributo por atributo, das instâncias da classe. PADRÕES DE PROJETO DE SOFTWARE 8 PADRÕES DE PROJETO DE SOFTWARE 9 Singleton O padrão de projeto Singleton é um dos padrões mais conhecidos e extensivamente utilizados em programação orientada a objetos. Está direcionado para as situações onde precisamos manter uma única instancia de uma classe durante toda a execução da aplicação. Por exemplo, para garantir apenas um spooler de impressão, embora tenhamos d iversas impressoras emum sistema, para armazenar uma conexão com uma base de dados que será chamadas diversas vezes, para armazenar o log da execução de uma aplicação, para centralizar os dados de configuração de um sistema, para armazenar os dados do usuário que está logado em um sistema, entre outros. A sua estrutura é bastante simples, existe apenas uma classe chamada Singleton, que define um método chamado Ins tance , responsável poder retornar aos clientes a única instancia da classe. Alguns recursos das linguagens de programação orientadas a objeto devem ser utilizados para garantir a correta implementação desta classe, por exemplo, em linguagem Java, podemos utilizar os seguintes recursos: PADRÕES DE PROJETO DE SOFTWARE 10 1.Modificadores static e private para garantir uma mesma instância para todos os objetos criados e evitar acesso público; 2.Modificar static para implementar o método getInstance e, assim, retornar a instancia apropriada ou criá-la, caso seja a primeira vez; 3.Construtor da classe privado, para não permitir a instância de novos objetos da classe; 4.Declarar o método getInstance como synchronized para que o método seja executado por uma thread por vez, quando utilizado em programas multi-thread; O código Java apresentado, mostra um esqueleto básico para implementação do padrão Singleton. Pesquise por exemplos e faça testes de instanciação e uso em seu ambiente de programação Java favorito. public class Singleton { private static Singleton instance; // Adicione aqui classes aninhadas ou atributos private private Singleton() { } PADRÕES DE PROJETO DE SOFTWARE 11 public static synchronized Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } // implemente os demais métodos necessários (get e set) } 1 Nesta aula, você: Estudou três padrões de criação: builder, singleton e prototype. Identificou as situações onde cada um deles deve ser aplicado. Estudou três exemplos práticos com a utilização destes padrões. REGISTRO DE PARTICIPAÇÃO 1. Assinale a alternativa que apresenta a situação que melhor caracteriza a utilização do padrão de projeto Singleton. PADRÕES DE PROJETO DE SOFTWARE 12 (1) Uma classe cliente pode acessar uma classe do sistema através de uma interface diferente da classe desejada. (2) Uma classe cliente precisa de uma interface idêntica à da classe existente, mas não tem acesso direto a ela. (3) Uma classe cliente precisa acessar um método que simplifique o acesso a uma hierarquia de classes. (4) Uma classe cliente precisa de uma classe que retorne uma única instância de uma classe existente. (5) Uma classe cliente precisa ser notificada sobre alterações no estado de um objeto. 2. O objetivo do padrão de projeto Builder é: (1) especificar os tipos de objetos a serem criados, usando uma instância-protótipo. (2) acessar uma classe do sistema através de uma interface diferente da classe desejada. (3) i m p l e m e n t a r u m a l g o r i t m o p a r a instanciar um objeto complexo. (4) retornar a única instância de uma classe. (5) retornar o clone de um objeto. PADRÕES DE PROJETO DE SOFTWARE 13 3 . Q u a l p a d r ã o d e p r o j e t o t e m s u a implementação facilitada pelo uso da interface Cloneable da linguagem de programação Java? 1) Prototype. 2) Builde. 3) Singleton. 4) FactoryMethod. 5) AbstractFactory. PADRÕES DE PROJETO DE SOFTWARE 14
Compartilhar