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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top