Buscar

Questionário de Padrão de Projeto de Software

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 7 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 6, do total de 7 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Prévia do material em texto

Questionário de Padrão de Projeto de Software
Assinale a alternativa que apresenta apenas padrões de criação GoF:
AbstractFactory, FactoryMethod, Builder.
Qual padrão de projeto permite a criação de objetos através de um método genérico, sem que o cliente precise ter conhecimento de qual classe concreta está sendo usada?
Template Method
Qual padrão de projeto permite a criação de uma família de objetos relacionados ou dependentes sem especificar a classe concreta que será utilizada?
AbstractFactory
4- Assinale a alternativa que apresenta a situação que melhor caracteriza a utilização do padrão de projeto Singleton.
Uma classe cliente precisa de uma classe que retorne uma única instância de uma classe existente.
5- O objetivo do padrão de projeto Builder é:
implementar um algoritmo para instanciar um objeto complexo.
6-Qual padrão de projeto tem sua implementação facilitada pelo uso da interface Cloneable da linguagem de programação Java?
Prototype
Padrões – Características
=> capturam soluções de projeto exaustivamente refinadas com o passar do tempo;
=>São resultados de um longo processo de projeto, teste e reflexão sobre o que torna um sistema mais flexível, reusável e moldular;
Padrões de criação GoF -
Builder
O padrão de projeto Builder é utilizado na instanciação de objetos complexos. Portanto, inicialmente, é preciso entender como caracterizar um objeto complexo. Um objeto é caracterizado como complexo quanto 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 um novo objeto. A ideia é atribuir 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.
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 alguma alteraçã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.
… 
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 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 (Especificar os tipos de objetos a serem criados usando uma instância-protótipo e criar novos objetos pela cópia desse protótipo(Gamma et al, 2000)).
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 em determinados momentos, nesses casos, basta pedir uma cópia do próprio objeto, ao invés de criar uma nova instancia manualmente.
Exemplificando:
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.
Singleton (Garantir que uma classe tenha somente uma instância e fornecer um ponto global de acesso para a mesma (Gamma et al,2000)).
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 diversas impressoras em um 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 Instance, 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:
Modificadores static e private para garantir uma mesma instância para todos os objetos criados e evitar acesso público;
Modificar static para implementar o método getInstance e, assim, retornar a instancia apropriada ou criá-la, caso seja a primeira vez;
Construtor da classe privado, para não permitir a instância de novos objetos da classe;
Declararo 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() {
 
  }
 
  public static synchronized Singleton getInstance() 
 {
     if (instance == null)
        instance = new Singleton();
  
   return instance;
  }
 
// implemente os demais métodos necessários (get e set)
}
 
1
Padrões Estruturais GoF (I)
Decorator
Programadores se deparam muitas vezes com a situação onde é preciso acrescentar responsabilidades a objetos e não a classe. Uma das opções é utilizar herança, entretanto, esta alternativa é estática. Outra alternativa é especificar uma nova classe para implementar cada responsabilidade que se deseja atribuir dinamicamente a um dado objeto. Esta nova classe se chama Decorator.
No exemplo apresentado na imagem utiliza-se como exemplo a montagem uma massa em um sistema de fast food. Inicialmente, escolhe-se o tipo da massa e a seguir escolhem-se os acompanhamentos (Decorator). Nesse caso, a implementação utilizando herança seria bastante complexa, iria requerer uma série de combinações diferentes. Na modelagem apresentada, primeiro escolhe-se o tipo de massa e a seguir acrescentam-se os acompanhamentos, cada qual, será adicionado dinamicamente ao objeto massa que foi previamente criado.
No exemplo apresentado, há quatro tipos de massas derivadas da classe abstrata Massa: Ravioli, Canelone, Spaghetti e Penne. Além de uma classe abstrata CondimentosDecorator que possui cinco classes derivadas: Molho4Queijos, MolhoSugo, MolhoBranco, Carne e Vegetais. Cada uma destas classes apresenta um método construtor que recebe os seguintes parâmetros: massa, descrição e custo do acompanhamento. 
Assim, uma vez instanciado um objeto Massa, pode-se adicionar dinamicamente diferentes condimentos. O trecho de código Java a seguir ilustra o funcionamento do método construtor das classes derivadas de CondimentosDecorator, fundamental para entender o funcionamento do padrão.
…
public Carne(Massa pmia, double pcusto) {
mia = pmia;
nome = pmia.getNome() + " Carne ";
custo= pmia.custo() + pcusto;
}
…
Atenção: O decorator deve conhecer o objeto decorado.
Veja que os valores originais dos atributos nome e custo do objeto Massa são somados a valores específicos para gerar o valor correspondente do objeto Carne, esta funcionalidade do método é que habilita a atribuição dinâmica de responsabilidades, cada novo objeto decorador recebe os valores anteriores e adiciona os seus próprios. O trecho de código abaixo apresenta a instanciação de um objeto massa e a adição de diferentes condimentos.
…
Massa miaMassa = new Ravioli("Ravioli del chef ", 16.0);
miaMassa = new QuatroQueijos(miaMassa, 1.0);
miaMassa = new Carne(miaMassa, 5.0);
miaMassa = new Vegetais (miaMassa, 2.0);
System.out.println("Nome = " + miaMassa.getNome() + " Preço da minha massa = " + miaMassa.custo());
…
A saída gerada pelo programa será:
Nome = Ravioli del chef QuatroQueijos Carne Vegetais Preço da minha massa = 24.0
Composite: (permite compor objetos em estruturas de árvores para representar hierarquias partes-todo. Permite aos clientes tratarem de maneira uniforme objetos individuais e composição de objetos (Gamma et al, 2000)).
O padrão de projeto Composite é utilizado, portanto, quando se pretende representar hierarquias partes-todo (ou todo-parte) de objetos, ou ainda, quando se pretende modelar relacionamento de agregação. A vantagem de utilizar este padrão é que o cliente irá acessar objetos compostos ou não de maneira uniforme, pois irá se relacionar com a classe abstrata Component. Ver, por exemplo, o método print do exemplo apresentado na Figura 2, quando se trata de uma parte, o processamento é realizado diretamente pela superclasse Componente, quando se trata de uma composição, o processamento é feito pela classe Composite, imprimindo todas as partes que compõem o objeto.
A imagem apresenta um exemplo bem conhecido para destacar a utilização do padrão Composite. Inicialmente, foi modelado uma classe abstrata para representa cada componente (Componente), a seguir definiu-se os objetos folhas (Leaf), tais como HD, Teclado, Monitor, Impressora, Memória e PlacaMae e um objeto composto (Composite). Na implementação do ultimo, utilizou-se uma estrutura de dados auxiliar (Vector) para armazenar os objetos partes. O trecho de código abaixo ilustra a utilização do padrão Composite.
...
HD hd=new HD(1,”HD 200Gb”);
Teclado tec=new Teclado(2, “Five Star”);
Mouse mou=new Mouse(3, “3botoes”);
Monitor mon= newMonitor(4,”LCD”);
Composite comp=new Composite(5,”Computador”);
comp.add(hd);
comp.add(tec);
comp.add(mou);
comp.add(mon);
comp.print();
...
Adapter (converter a interface de uma classe em outra interface, esperada pelos clientes. O adapter permite que classes com interfaces incompatíveis trabalhem em conjunto (Gamma et al, 2000)).
O padrão Adapter é bastante utilizado para compatibilizar classes implementas por programadores diferentes, ou desenvolvidas em momentos diferentes, ou ainda para unir classes com interfaces diferentes em uma estrututura hierarquica única, sem precisar implementar novamente todas as funcionalidades e interfaces da classe já existente. A ideia é criar uma nova classe (Adapter) com a interface padrão que se deseja para fazer a conexão com a classe já existente (Adaptee) com interface diferente da estrutura de classes que se pretende utilizar no sistema.
Bridge (Desacoplar uma abstração da sua implementação, de modo que as duas possam variar independentemente (Gamma et al, 2000).
Desenvolver aplicações portáveis é um desejo de todo programador, permitir que o sistema consiga se adaptar dinamicamente a diferentes plataformas é mais desejável ainda. O padrão Bridge tem potencial para auxiliar nessas situações. A solução natural quando se pretende desenvolver uma determinada solução para duas plataformas diferentes é utilizar herança, implementando uma classe derivada para cada situação. No entanto, assim como discutido na seção sobre o padrão Decorator, esta abordagem relaciona uma abstração (entende-se definição dos métodos e atributos) a sua implementação permanentemente, oferecendo pouca flexibilidade para mudanças e reutilização das abstrações e implementações de forma independente.
Infelizmente a quebra de sigilo de informações nos faz pensar se realmente a computação em nuvem é segura ou não? O que ainda precisa ser feito para melhorar neste sentido? O que as empresas que detém as informações disseram sobre o furto dos mesmos? São várias as indagações e é isso que que vai alavancar ainda mais a computação em nuvem. Por um lado a desconfiança por este serviço e por outro uma gama de estudiosos buscando melhorar o que já era o melhor. Com essa espionagem as empresas que fornece os serviços de computação em nuvem nos EUA vão despencar, por outro lado cada país vai querer adotar o sistema de guardar suas informações no seu próprio território e superações em termos de segurança vão surgir. 
Acredito que com toda essa turbulência a computação em nuvem privada ganhará um disparo no mercado dos negócios.
Com a computação em nuvem as empresas começarão a não mais terem equipamentos de última geração em seus espaços físicos, utilizando cada vez mais as vantagens da tecnologia nuvem a seu favor como: armazenamento de dados, aplicações (existem diversos aplicativos como planilhas, edição de texto...), cooperativismo ( acesso, avaliação, atualização de documento em tempo real com participação de mais de uma pessoa), independência de sistema operacional do usuário.
Com essas vantagens os benefícios permitiria a realização do mesmotrabalho em um espaço de tempo drasticamente reduzido, sem grande investimentos em plataforma de processamento, o custo seria proporcional ao tempo de utilização ou assinatura, contribuição com o meio ambiente, uma vez que utilize menos equipamentos físicos.
 
A computação em nuvem tem muitas vantagens para as empresas de todos os portes: armazenamento de dados,  aplicações, cooperativismo, independência de plataforma do usuário, essas vantagens tiram toda aquelas limitações de equipamentos da empresa para usar

Outros materiais