Salve galera!! Continuando, já foram 4, restam 19 + extras!

Hoje vamos abordar o pattern Prototype, vamos lá!

Prototype

Prototype é um padrão que faz parte do grupo de padrões Criacionais e que permite a criação de novos objetos a partir de um modelo original, ou como o próprio nome indica, um protótipo, que é clonado.

Entre suas utilidades, encontramos:

  • Evitar que as subclasses que criam objetos funcionem como o padrão Abstract Factory;
  • Evitar criar um novo objeto utilizando a palavra new, o que diminui o custo de memória;
  • Em vez de o cliente implementar um código que utiliza o operador new, este utiliza o método Clone() presente no protótipo e o método de uma fábrica (Factory Method ou Abstract Factory) que fica encarregada de clonar o novo objeto;

No livro, ele foi descrito com os seguintes elementos:

  • Prototype: Uma classe que declara uma interface para objetos capazes de clonar a si mesmo;
  • PrototypeConcreto: Implementação de um Prototype;
  • Cliente: Cria um novo objeto através de um Prototype que é capaz de clonar a si mesmo;

Analisando de forma clara, cada objeto é, ele próprio, um factory especializado em construir objetos iguais a si mesmo. O Prototype é utilizado frequentemente em linguagens estaticamente tipadas como C++, Java e C#, e menos frequentemente utilizadas em linguagens dinamicamente tipadas como Smalltalk.

O padrão Prototype exige a implementação de uma operação de clonagem em cada uma das classes concretas do protótipo. Esta tarefa pode ser inconveniente, no caso do reaproveitamento de classes preexistentes que não possuem tal operação, ou mesmo complexa, se for considerada a possibilidade de existirem referências circulares nos atributos de um objeto.

Utilização

O padrão Prototype é aplicado quando existe a necessidade de clonar, literalmente, um objeto. Ou seja, quando a aplicação precisa criar cópias exatas de algum objeto em tempo de execução este padrão é altamente recomendado. Este padrão pode ser utilizado em sistemas que precisam ser independentes da forma como os seus componentes são criados, compostos e representados. O padrão Prototype pode ser útil em sistemas com as seguintes características:

  • Sistemas que utilizam classes definidas em runtime;
  • Sistemas que utilizam o padrão Abstract Factory, para criação de objetos. Neste caso, a hierarquia de classes pode se tornar muito complexa e o padrão Prototype pode ser uma alternativa mais simples, por realizar a mesma tarefa com um número reduzido de classes;
  • Sistemas que possuem componentes cujo estado inicial possui poucas variações e onde é conveniente disponibilizar um conjunto preestabelecido de protótipos que dão origem aos objetos que compõem o sistema.

Algumas vezes, padrões criacionais podem ser “competidores”: Existem casos em que o Prototype ou Abstract Factory podem ser utilizados apropriadamente. Em outros, eles são complementares: Um Abstract Factory pode conter um set de Prototypes no qual clona e retorna o produto de objetos.

Quando utilizamos o Spring framework, por exemplo, um desenvolvedor pode configurar um Bean como “Prototype”. Esta configuração faz com que cada uma das referências a um Bean aponte para uma instância diferente. O comportamento padrão, ou Singleton, define que todas as referências a um Bean apontem para a mesma instância de uma classe.

Uma das principais vantagens de sua utilização é quando a inicialização de um objeto pode se tornar custosa, e você quer fazer algumas pequenas variações ao inicializar. Nesse contexto, o Prototype pode então evitar a criação “do zero” de novos objetos.

Ficha Resumo

Vamos a ficha resumo do pattern, onde daremos um exemplo em C# e teremos suas vantagens e desvantagens:

  • Nome: Prototype;
  • Objetivo / intenção: Permitir a criação de novos objetos a partir de um modelo original, ou como o próprio nome indica, um protótipo, que é clonado;
  • Motivação: Evitar que as subclasses que criam objetos funcionem como o padrão Abstract Factory ou mesmo evitar criar um novo objeto utilizando a palavra new, o que diminui o custo de memória;
  • Aplicabilidade: O padrão Prototype é aplicado quando existe a necessidade de clonar, literalmente, um objeto. Ou seja, quando a aplicação precisa criar cópias exatas de algum objeto em tempo de execução este padrão é altamente recomendado. Este padrão pode ser utilizado em sistemas que precisam ser independentes da forma como os seus componentes são criados, compostos e representados;
  • Estrutura: Abaixo temos um exemplo de estrutura onde temos um classe Prototype, que declara uma interface para objetos capazes de clonar a si mesmo, a class PrototypeConcreto, que são uma implementação de Prototype e a classe Cliente, que um novo objeto através de um Prototype que é capaz de clonar a si mesmo;
  • Consequências: Prototype facilita bastante quando temos classes que precisam simplesmente serem clonadas de forma livre e que definam seu comportamento em runtime, mas exige a implementação de uma operação de clonagem em cada uma das classes concretas do protótipo. Esta tarefa pode ser inconveniente, no caso do reaproveitamento de classes preexistentes que não possuem tal operação, ou mesmo complexa, se for considerada a possibilidade de existirem referências circulares nos atributos de um objeto;
  • Implementações: Temos abaixo um código em C# que demonstra o uso do padrão Prototype, na produção de objetos que representam cores, onde o ColorManager possui as as definições destas cores e apenas clona elas para uso posterior.
  • Usos conhecidos: Quando utilizamos o Spring framework, por exemplo, um desenvolvedor pode configurar um Bean como “Prototype”. Esta configuração faz com que cada uma das referências a um Bean aponte para uma instância diferente. O comportamento padrão, ou Singleton, define que todas as referências a um Bean apontem para a mesma instância de uma classe.
  • Padrões relacionados: Abstract Factory, Factory Method e Singleton;

Concluindo

Este foi o padrão Prototype. Ele é bem útil em sistemas que precisamos clonar livremente os objetos e que suas definições sejam feitas em runtime. Na próxima parte desta série, vamos abordar o padrão Singleton, o último do grupo de criacionais.

Como sempre, aguardo feedbacks e dúvidas de vocês! Nos vemos em breve!