criação de objeto de padrão de design de protótipo java
-
13-12-2019 - |
Pergunta
Eu estava analisando o padrão de design Prototype e tive algumas dúvidas.
Entendi que o padrão de design Prototype é usado para a criação de objetos que são caros em termos de memória ou recursos.Nesse caso utilizamos um clone do objeto que já está disponível.
Então, qual é a diferença entre criar um new
objeto e clone()
?Onde o objeto está armazenado na memória?
Solução
O padrão de design do protótipo oferece dois tipos de economia de custos - economia de tempo e economia de espaço.
A economia de tempo ocorre em situações em que a criação de um objeto requer acesso dispendioso a informações auxiliares - por exemplo, solicitação de dados de configuração de um arquivo, banco de dados ou através de uma rede.Por exemplo, se você estiver construindo muitas páginas a partir de um modelo armazenado em um servidor web, é mais barato ler o modelo uma vez e cloná-lo para obter o ponto inicial de cada nova página, em vez de consultar o servidor web separadamente para obter informações. cada página.
A economia de memória vem da reutilização de objetos imutáveis:se o seu original contiver muitas strings, a criação de uma nova instância precisará criar strings imutáveis inteiramente novas ou lidar com a internação de strings manualmente.Usar o padrão de protótipo evita esse problema, permitindo que o clone compartilhe as partes imutáveis do modelo.
Outras dicas
O Java clone()
método apenas cria um novo objeto e copia os valores das variáveis de membro nele.Em geral, não é nem mais nem menos caro do que criar um novo objeto.A única vez clone()
pode ser mais barato do que criar um objeto com new
seria quando o construtor de um objeto faz algo caro:por exemplo, e se o construtor pegasse os argumentos e os usasse como parte de uma consulta ao banco de dados?Nesse caso, usando clone()
seria mais barato, pois a dispendiosa operação de consulta não aconteceria.
Existem outras razões para usar esse padrão de design:principalmente, quando os objetos precisam de configuração complicada antes do uso, o que não pode ser feito convenientemente em um construtor.Imagine que um objeto tivesse 20 propriedades que precisavam ser definidas.Se você defini-los com parâmetros de construtor, esse construtor seria terrivelmente feio – imagine um construtor com 20 parâmetros!Em vez disso, você poderia construir um objeto talvez sem parâmetros, definir os 20 valores usando métodos modificadores e então clone()
o objetivo de fazer cópias prontas quando necessário. clone()
não precisa de nenhum parâmetro, então é obviamente menos feio.Se você precisar de múltiplas cópias de diversas versões diferentes deste objeto, o padrão do protótipo se tornará atraente.
O padrão de design de protótipo é usado quando a criação de objetos exige muitos recursos e desempenho do sistema, e usamos esse padrão de design exatamente quando queremos ter muitas instâncias de uma classe, e essas instâncias são semelhantes, então não queremos realmente para usar por exemplo o operador “novo” porque será muito caro, basta instanciar esses objetos com base no primeiro já criado.
a vantagem é que o novo objeto será independente e não exigirá muitos recursos para ser criado como o primeiro.aqui está um exemplo de uso deste conceito em java:
import java.util.Vector;
public class Samsung implements Cloneable{
private Vector<String> models;
public Samsung(){
models=new Vector<>();
//we suppose in this comments we access to a data Base to get models
//and then we get a full list of Samsung models
//... and finish
//Sadly we took to much of time to fetch the database
//we don't want to waste our time again because Samsung rarely update its database
models.add("Samsung S1");
models.add("Samsung S2");
models.add("galaxy note");
models.add("galaxy star");
}
public Samsung(Vector<String> models){
this.models=models;
}
public Samsung clone() {
Vector<String> modelsCopy=new Vector<>();
Samsung samsungCopy=null;
//here we don't need to access the database again, we will just copy the previous list
try{
for(String model:this.models){
modelsCopy.add(model);
}
samsungCopy=new Samsung(modelsCopy);
return samsungCopy;
}
catch(Exception e){
return null;
}
}
}
o programa principal:
public static void main(String[] args) {
Samsung usa_Samsung=new Samsung();
Samsung morocco_Samsung=usa_Samsung.clone();
System.out.println("original = " + usa_Samsung);
System.out.println("copy = " + morocco_Samsung);
}
saída :
original = Samsung@6d06d69c
copy = Samsung@7852e922
como você vê, esses objetos não têm o mesmo endereço porque são diferentes.
Observação !usei o nome “Samsung” apenas como exemplo.