Buscar

PADRÕES DE PROJETO DE SOFTWARE AULA 02

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

Continue navegando