Os padrões de projeto representam as melhores práticas usadas por desenvolvedores experientes de software orientado a objetos. Os padrões de design são soluções para problemas gerais que os desenvolvedores de software enfrentaram durante o desenvolvimento de software. Essas soluções foram obtidas por tentativa e erro por vários desenvolvedores de software durante um período de tempo considerável.

Em 1994, quatro autores Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides publicaram um livro intitulado Design Patterns - Elements of Reusable Object-Oriented Software que deu início ao conceito de Design Pattern no desenvolvimento de software. Esses autores são conhecidos coletivamente como Gang of Four (GOF).

Os padrões de projeto podem ser classificados em três categorias: padrões criacionais, estruturais e comportamentais.

  • Creational Patterns- Esses padrões de projeto fornecem uma maneira de criar objetos enquanto ocultam a lógica de criação, em vez de instanciar objetos diretamente usando o novo opreator. Isso dá ao programa mais flexibilidade para decidir quais objetos precisam ser criados para um determinado caso de uso.

  • Structural Patterns- Esses padrões de projeto dizem respeito à composição de classes e objetos. O conceito de herança é usado para compor interfaces e definir formas de compor objetos para obter novas funcionalidades.

  • Behavioral Patterns - Esses padrões de design estão especificamente preocupados com a comunicação entre objetos.

Esses padrões de design estão especificamente relacionados com a camada de apresentação. Esses padrões são identificados pelo Sun Java Center.

O padrão de fábrica é um dos padrões de design mais usados ​​em Java. Esse tipo de padrão de design está incluído no padrão de criação, pois esse padrão fornece uma das melhores maneiras de criar um objeto.

No padrão de fábrica, criamos o objeto sem expor a lógica de criação ao cliente e nos referimos ao objeto recém-criado usando uma interface comum.

Os padrões abstratos de fábrica funcionam em torno de uma super-fábrica que cria outras fábricas. Esta fábrica também é chamada de fábrica de fábricas. Esse tipo de padrão de design está incluído no padrão de criação, pois esse padrão fornece uma das melhores maneiras de criar um objeto.

No padrão Abstract Factory, uma interface é responsável por criar uma fábrica de objetos relacionados sem especificar explicitamente suas classes. Cada fábrica gerada pode fornecer os objetos de acordo com o padrão Factory.

O padrão Singleton é um dos padrões de design mais simples em Java. Esse tipo de padrão de design está incluído no padrão de criação, pois esse padrão fornece uma das melhores maneiras de criar um objeto.

Este padrão envolve uma única classe que é responsável por criar um objeto enquanto garante que apenas um único objeto seja criado. Esta classe fornece uma maneira de acessar seu único objeto que pode ser acessado diretamente sem a necessidade de instanciar o objeto da classe.

É um processo de duas etapas. Primeiro, torne o construtor privado para que o novo operador não possa ser usado para instanciar a classe. Retorne um objeto do objeto se não for nulo, caso contrário, crie o objeto e retorne o mesmo por meio de um método.

A seguir estão as diferenças entre uma classe estática e uma classe singleton.

  • Uma classe estática não pode ser uma classe de nível superior e não pode implementar interfaces onde uma classe singleton pode.

  • Todos os membros de uma classe estática são estáticos, mas para uma classe Singleton isso não é um requisito.

  • Uma classe estática é inicializada quando é carregada para que não possa ser carregada lentamente, enquanto uma classe singleton pode ser carregada lentamente.

  • Um objeto de classe estática é armazenado na pilha, enquanto o objeto de classe única é armazenado no espaço de memória heap.

Sim.

Lance uma exceção dentro do corpo do método clone ().

A seguir estão alguns dos padrões de design que são usados ​​na biblioteca JDK.

  • O padrão Decorator é usado pelas classes Wrapper.

  • O padrão Singleton é usado pelas classes Runtime e Calendar.

  • O padrão de fábrica é usado pela classe Wrapper como Integer.valueOf.

  • O padrão Observer é usado por estruturas de manipulação de eventos como swing, awt.

O padrão de fábrica encapsula os detalhes de implementação e a implementação subjacente pode ser alterada sem qualquer impacto na API do chamador.

O padrão Builder constrói um objeto complexo usando objetos simples e usando uma abordagem passo a passo. Este construtor é independente de outros objetos.

O padrão de protótipo se refere à criação de objetos duplicados, mantendo o desempenho em mente. Esse padrão envolve a implementação de uma interface de protótipo que informa para criar um clone do objeto atual.

Este padrão é usado quando a criação de um objeto diretamente é cara. Por exemplo, um objeto deve ser criado após uma operação cara do banco de dados. Podemos armazenar o objeto em cache, retornar seu clone na próxima solicitação e atualizar o banco de dados como e quando necessário, reduzindo assim as chamadas ao banco de dados.

O padrão do adaptador funciona como uma ponte entre duas interfaces incompatíveis. Este padrão envolve uma única classe que é responsável por unir funcionalidades de interfaces independentes ou incompatíveis.

Um exemplo da vida real poderia ser um caso de leitor de cartão que atua como um adaptador entre o cartão de memória e um laptop. Você pluga o cartão de memória no leitor de cartão e o leitor de cartão no laptop para que o cartão de memória possa ser lido no laptop.

Bridge é usado quando precisamos desacoplar uma abstração de sua implementação para que as duas possam variar independentemente. Esse tipo de padrão de design vem sob o padrão estrutural, pois esse padrão desacopla a classe de implementação e a classe abstrata, fornecendo uma estrutura de ponte entre elas.

Este padrão envolve uma interface que atua como uma ponte que torna a funcionalidade de classes concretas independente das classes implementadoras de interface. Ambos os tipos de classes podem ser alterados estruturalmente sem afetar um ao outro.

O padrão de filtro ou padrão de critérios é um padrão de design que permite aos desenvolvedores filtrar um conjunto de objetos usando critérios diferentes e encadeando-os de forma desacoplada por meio de operações lógicas. Esse tipo de padrão de projeto está sob o padrão estrutural, pois esse padrão combina vários critérios para obter um único critério.

O padrão composto é usado quando precisamos tratar um grupo de objetos de maneira semelhante a um único objeto. O padrão composto compõe objetos em termos de uma estrutura de árvore para representar parte, bem como toda a hierarquia. Esse tipo de padrão de projeto está incluído no padrão estrutural, pois esse padrão cria uma estrutura em árvore de um grupo de objetos.

Este padrão cria uma classe que contém um grupo de seus próprios objetos. Esta classe fornece maneiras de modificar seu grupo de mesmos objetos.

O padrão Decorator permite que um usuário adicione nova funcionalidade a um objeto existente sem alterar sua estrutura. Esse tipo de padrão de design vem sob o padrão estrutural, pois esse padrão atua como um invólucro para a classe existente.

Esse padrão cria uma classe decoradora que envolve a classe original e fornece funcionalidade adicional, mantendo a assinatura dos métodos de classe intacta.

O padrão de fachada oculta as complexidades do sistema e fornece uma interface para o cliente, por meio da qual o cliente pode acessar o sistema. Esse tipo de padrão de design vem sob o padrão estrutural, pois esse padrão adiciona uma interface ao sistema existente para ocultar suas complexidades.

Esse padrão envolve uma única classe que fornece métodos simplificados exigidos pelo cliente e delega chamadas para métodos de classes de sistema existentes.

O padrão Flyweight é usado principalmente para reduzir o número de objetos criados e para diminuir o consumo de memória e aumentar o desempenho. Este tipo de padrão de design vem sob o padrão estrutural, pois este padrão fornece maneiras de diminuir a contagem de objetos, melhorando assim a estrutura de objetos do aplicativo.

O padrão Flyweight tenta reutilizar objetos de tipo semelhantes já existentes, armazenando-os e cria um novo objeto quando nenhum objeto correspondente é encontrado.

No padrão de proxy, uma classe representa a funcionalidade de outra classe. Este tipo de padrão de projeto vem sob o padrão estrutural.

No padrão proxy, criamos um objeto com objeto original para fazer a interface de sua funcionalidade com o mundo exterior.

Como o nome sugere, o padrão de cadeia de responsabilidade cria uma cadeia de objetos receptores para uma solicitação. Esse padrão separa o emissor e o receptor de uma solicitação com base no tipo de solicitação. Esse padrão vem em padrões de comportamento.

Neste padrão, normalmente cada receptor contém referência a outro receptor. Se um objeto não pode lidar com a solicitação, ele passa o mesmo para o próximo receptor e assim por diante.

O padrão de comando é um padrão de design orientado a dados e se enquadra na categoria de padrão comportamental. Uma solicitação é agrupada em um objeto como comando e passada ao objeto invocador. O objeto Invoker procura o objeto apropriado que pode manipular este comando e passa o comando para o objeto correspondente que executa o comando.

O padrão de intérprete fornece uma maneira de avaliar a gramática ou expressão da linguagem. Esse tipo de padrão está incluído no padrão comportamental. Esse padrão envolve a implementação de uma interface de expressão que informa para interpretar um contexto específico.

Este padrão é usado na análise SQL, mecanismo de processamento de símbolo etc.

O padrão de iterador é um padrão de design muito comumente usado no ambiente de programação Java e .Net. Esse padrão é usado para obter uma maneira de acessar os elementos de um objeto de coleção de maneira sequencial, sem a necessidade de saber sua representação subjacente. O padrão do iterador se enquadra na categoria de padrão comportamental.

A seguir estão as entidades desse tipo de padrão de design.

  • Service- Serviço real que processará a solicitação. A referência de tal serviço deve ser consultada no servidor JNDI.

  • Context / Initial Context - O contexto JNDI carrega a referência ao serviço usado para fins de pesquisa.

  • Service Locator - Service Locator é um único ponto de contato para obter serviços por meio do cache de pesquisa JNDI dos serviços.

  • Cache - Cache para armazenar referências de serviços para reutilizá-los.

  • Client - Cliente é o objeto que invoca os serviços via ServiceLocator.

O padrão de mediador é usado para reduzir a complexidade da comunicação entre vários objetos ou classes. Esse padrão fornece uma classe mediadora que normalmente lida com todas as comunicações entre classes diferentes e oferece suporte à fácil manutenção do código por meio de acoplamento fraco. O padrão do mediador se enquadra na categoria de padrão comportamental.

O padrão memento é usado para restaurar o estado de um objeto a um estado anterior. O padrão de memento cai na categoria de padrão comportamental.

O padrão Memento usa três classes de ator. Memento contém o estado de um objeto a ser restaurado. O Originador cria e armazena estados nos objetos Memento e o objeto Caretaker é responsável por restaurar o estado do objeto a partir do Memento.

O padrão do observador é usado quando há relacionamento um-para-muitos entre objetos, como se um objeto for modificado, seus objetos dependentes serão notificados automaticamente. O padrão do observador se enquadra na categoria de padrão comportamental.

O padrão Observer usa três classes de ator. Sujeito, observador e cliente. Assunto é um objeto que possui métodos para anexar e desanexar observadores a um objeto cliente. Criamos uma classe abstrata Observer e uma classe concreta Subject que está estendendo a classe Observer.

No padrão State, o comportamento de uma classe muda com base em seu estado. Este tipo de padrão de design está incluído no padrão de comportamento. No padrão State, criamos objetos que representam vários estados e um objeto de contexto cujo comportamento varia conforme seu objeto de estado muda.

No padrão Null Object, um objeto null substitui a verificação da instância do objeto NULL. Em vez de colocar if check para um valor nulo, Null Object reflete um relacionamento não fazer nada. Esse objeto Nulo também pode ser usado para fornecer comportamento padrão caso os dados não estejam disponíveis.

No padrão Objeto Nulo, criamos uma classe abstrata especificando várias operações a serem feitas, classes concretas que estendem essa classe e uma classe de objeto nulo que não faz nenhuma implementação dessa classe e será usada sem problemas quando precisarmos verificar o valor nulo.

No padrão Strategy, o comportamento de uma classe ou seu algoritmo pode ser alterado em tempo de execução. Este tipo de padrão de design está incluído no padrão de comportamento.

No padrão Strategy, criamos objetos que representam várias estratégias e um objeto de contexto cujo comportamento varia de acordo com seu objeto de estratégia. O objeto de estratégia muda o algoritmo de execução do objeto de contexto.

No padrão Template, uma classe abstrata expõe formas / modelos definidos para executar seus métodos. Suas subclasses podem substituir a implementação do método conforme a necessidade, mas a invocação deve ser da mesma forma definida por uma classe abstrata. Esse padrão está incluído na categoria de padrão de comportamento.

No padrão Visitor, usamos uma classe visitante que altera o algoritmo de execução de uma classe de elemento. Desta forma, o algoritmo de execução do elemento pode variar conforme e quando o visitante varia. Esse padrão está incluído na categoria de padrão de comportamento. De acordo com o padrão, o objeto de elemento deve aceitar o objeto de visitante para que esse objeto de visitante controle a operação no objeto de elemento.

MVC Pattern significa Model-View-Controller Pattern. Esse padrão é usado para separar os interesses do aplicativo.

  • Model- O modelo representa um objeto ou JAVA POJO carregando dados. Ele também pode ter lógica para atualizar o controlador se seus dados mudarem.

  • View - View representa a visualização dos dados que o modelo contém.

  • Controller- O controlador atua no modelo e na visualização. Ele controla o fluxo de dados no objeto do modelo e atualiza a visualização sempre que os dados são alterados. Ele mantém a visualização e o modelo separados.

O Business Delegate Pattern é usado para separar a camada de apresentação da camada de negócios. É basicamente usado para reduzir a comunicação ou a funcionalidade de pesquisa remota para o código da camada de negócios no código da camada de apresentação. Na camada de negócios, temos as seguintes entidades.

  • Client - O código da camada de apresentação pode ser JSP, servlet ou código UI java.

  • Business Delegate - Uma classe de ponto de entrada único para entidades cliente para fornecer acesso aos métodos de serviço comercial.

  • LookUp Service - O objeto de serviço de pesquisa é responsável por obter a implementação de negócios relativa e fornecer acesso de objeto de negócios ao objeto de delegado de negócios.

  • Business Service- Interface de serviço comercial. Classes concretas implementam esse serviço de negócios para fornecer lógica de implementação de negócios real.

O padrão Composite Entity é usado no mecanismo de persistência EJB. Uma entidade Composite é um bean de entidade EJB que representa um gráfico de objetos. Quando uma entidade composta é atualizada, os beans de objetos internamente dependentes são atualizados automaticamente como sendo gerenciados pelo bean de entidade EJB. A seguir estão os participantes do Composite Entity Bean.

  • Composite Entity- É um bean de entidade primário. Ele pode ser de granulação grossa ou pode conter um objeto de granulação grossa a ser usado para fins de persistência.

  • Coarse-Grained Object- Este objeto contém objetos dependentes. Ele tem seu próprio ciclo de vida e também gerencia o ciclo de vida de objetos dependentes.

  • Dependent Object - Objeto dependente é um objeto que depende de um objeto de granulação grossa para seu ciclo de vida de persistência.

  • Strategies - Estratégias representa como implementar uma entidade composta.

Data Access Object Pattern ou DAO pattern é usado para separar dados de baixo nível acessando API ou operações de serviços de negócios de alto nível. A seguir estão os participantes do Data Access Object Pattern.

  • Data Access Object Interface - Esta interface define as operações padrão a serem realizadas em um (s) objeto (s) de modelo.

  • Data Access Object concrete class- Esta classe implementa a interface acima. Esta classe é responsável por obter dados de uma fonte de dados que pode ser database / xml ou qualquer outro mecanismo de armazenamento.

  • Model Object or Value Object - Este objeto é um POJO simples contendo métodos get / set para armazenar dados recuperados usando a classe DAO.

O padrão de design do controlador frontal é usado para fornecer um mecanismo centralizado de tratamento de solicitações, de forma que todas as solicitações sejam tratadas por um único tratador. Esse manipulador pode fazer a autenticação / autorização / registro ou rastreamento da solicitação e, em seguida, passar as solicitações aos manipuladores correspondentes. A seguir estão as entidades desse tipo de padrão de design.

  • Front Controller - Manipulador único para todos os tipos de solicitações que chegam ao aplicativo (seja baseado na web / desktop).

  • Dispatcher - O Front Controller pode usar um objeto dispatcher que pode despachar a solicitação para o manipulador específico correspondente.

  • View - As visualizações são o objeto para o qual as solicitações são feitas.

O padrão de design de filtro de interceptação é usado quando queremos fazer algum pré-processamento / pós-processamento com solicitação ou resposta do aplicativo. Filtros são definidos e aplicados na solicitação antes de passar a solicitação para o aplicativo de destino real. Os filtros podem fazer a autenticação / autorização / registro ou rastreamento da solicitação e, em seguida, passar as solicitações aos manipuladores correspondentes.

A seguir estão as entidades desse tipo de padrão de design.

  • Filter - Filtro que realizará determinada tarefa antes ou depois da execução da solicitação pelo manipulador de solicitações.

  • Filter Chain - A Cadeia de Filtros carrega vários filtros e ajuda a executá-los em uma ordem definida no destino.

  • Target - O objeto de destino é o manipulador de solicitação.

  • Filter Manager - Filter Manager gerencia os filtros e Filter Chain.

  • Client - Cliente é o objeto que envia a solicitação ao objeto Destino.

O padrão de design do localizador de serviço é usado quando queremos localizar vários serviços usando a pesquisa JNDI. Considerando o alto custo de pesquisa de JNDI para um serviço, o padrão Service Locator faz uso da técnica de cache. Pela primeira vez, um serviço é necessário, o Service Locator procura no JNDI e armazena em cache o objeto de serviço. Pesquisa adicional ou mesmo serviço através do Service Locator é feito em seu cache, o que melhora o desempenho do aplicativo em grande medida.

O padrão Transfer Object é usado quando queremos passar dados com vários atributos de uma vez do cliente para o servidor. O objeto de transferência também é conhecido como objeto de valor. Transfer Object é uma classe POJO simples com métodos getter / setter e é serializável para que possa ser transferido pela rede. Não tem nenhum comportamento. A classe de negócios do lado do servidor normalmente busca dados do banco de dados e preenche o POJO e os envia para o cliente ou os passa por valor. Para o cliente, o objeto de transferência é somente leitura. O cliente pode criar seu próprio objeto de transferência e passá-lo ao servidor para atualizar os valores no banco de dados de uma só vez. A seguir estão as entidades desse tipo de padrão de design.

  • Business Object - Business Service preenche o Transfer Object com dados.

  • Transfer Object - POJO simples com métodos para definir / obter apenas atributos.

  • Client - O cliente solicita ou envia o Transfer Object para o Business Object.