Prototype Nota: Para outros significados, veja Prototype (desambiguação).
Prototype, na ciência da computação, é um padrão de projeto de software (design pattern, em inglês). Criacional que permite a criação de novos objetos a partir de um modelo original ou protótipo que é clonado. Este padrão pode ser utilizado para:
EstruturaO padrão Prototype, da forma como foi descrito no livro Design Patterns: Elements of Reusable Object-Oriented Software, contém os seguintes elementos:
Efetivamente, cada objeto é, ele próprio, um factory especializado em construir objetos iguais a si mesmo. O padrão Prototype é utilizado frequentemente em linguagens estaticamente tipadas como C++ e Java, 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 (um objeto possui um atributo que referencia um objeto que, por sua vez, referencia o objeto original). UtilizaçãoO 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:
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. Muitos Designers começam utilizando o Factory Method, pois seu uso é menos complicado, mas então evoluem para Abstract Factory, Prototype ou Builder, que são mais flexíveis porém mais complexos. E é neste ponto em que o Factory Method e Prototype divergem: O primeiro requer subclasses, mas não precisa ser inicializado. O segundo, não necessita de subclasses porém precisa ser inicializado. Quando utiliza o framework Spring, por exemplo, um desenvolvedor pode configurar um JavaBean como "prototype". Esta configuração faz com que cada uma das referências a um JavaBean aponte para uma instância diferente. O comportamento padrão, ou singleton, define que todas as referências a um JavaBean apontem para a mesma instância de uma classe.[1] 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. ExemploNeste exemplo é mostrado uma hierarquia de classes representando documentos de formato ASCII e PDF que são criados através da classe DiagramaCódigoEste código, escrito na linguagem Java, mostra a implementação do diagrama mostrado acima. public interface ICloneable {
public Object clone();
}
abstract class Documento implements ICloneable {
protected Documento clone() {
Object clone = null;
try {
clone = super.clone();
} catch (CloneNotSupportedException ex) {
ex.printStackTrace();
}
return (Documento) clone;
}
}
class ASCII extends Documento { }
class PDF extends Documento { }
class Cliente {
static final int DOCUMENTO_TIPO_ASCII = 0;
static final int DOCUMENTO_TIPO_PDF = 1;
private Documento ascii = new ASCII();
private Documento pdf = new PDF();
public Documento criarDocumento(int tipo) {
if (tipo == Cliente.DOCUMENTO_TIPO_ASCII) {
return ascii.clone();
} else {
return pdf.clone();
}
}
}
Observação: Na linguagem Java, a interface Neste exemplo, a implementação da cópia da instância é delegada ao método Referências
Bibliografia
Ver também |