Создание объекта шаблона проектирования прототипа Java

Я просматривал шаблон проектирования прототипа и у меня возникли вопросы.

Я понял, что шаблон проектирования «Прототип» используется для создания объектов, требующих больших затрат памяти или ресурсов. В этом случае мы используем клон уже доступного объекта.

Так в чем разница между созданием объекта new и clone()? Где объект хранится в памяти?


person user414967    schedule 29.07.2012    source источник
comment
это может быть полезно для вас stackoverflow.com/questions/663079/   -  person Nandkumar Tekale    schedule 29.07.2012


Ответы (3)


Шаблон проектирования прототипа предлагает экономию затрат двух видов - экономию времени и экономию места.

Экономия времени достигается в ситуациях, когда для создания объекта требуется дорогостоящий доступ к вспомогательной информации - например, запрос данных конфигурации из файла, базы данных или по сети. Например, если вы создаете множество страниц из шаблона, который хранится на веб-сервере, дешевле прочитать шаблон один раз и клонировать его, чтобы получить отправную точку для каждой новой страницы, чем запрашивать веб-сервер отдельно для каждую страницу.

Экономия памяти достигается за счет повторного использования неизменяемых объектов: если ваш оригинал содержит много строк, для создания нового экземпляра потребуется либо создать полностью новые неизменяемые строки, либо иметь дело с интернированием строк вручную. Использование шаблона прототипа изящно позволяет избежать этой проблемы, позволяя клону совместно использовать неизменяемые части шаблона.

person Sergey Kalinichenko    schedule 29.07.2012
comment
Совместное использование неизменяемых полей между объектами - это скорее шаблон «Легковес», чем прототип. Оба шаблона ценны и могут использоваться вместе, но это отдельные шаблоны. - person jaco0646; 26.05.2020

Метод Java clone() просто создает новый объект и копирует в него значения переменных-членов. В общем, это не дороже и не дешевле, чем создание нового объекта. Единственный раз, когда clone() может быть дешевле, чем создание объекта с new, - это когда конструктор объекта делает что-то дорогостоящее: например, что, если конструктор взял аргументы и использовал их как часть запроса к базе данных? В этом случае использование clone() было бы дешевле, поскольку не выполнялась бы дорогостоящая операция запроса.

Однако есть и другие причины для использования этого шаблона проектирования: в основном, когда объекты требуют сложной настройки перед использованием, что не может быть удобно сделано в конструкторе. Представьте, что у объекта есть 20 свойств, которые необходимо задать. Если вы установите их с параметрами конструктора, этот конструктор будет ужасно уродливым - представьте конструктор с 20 параметрами! Вместо этого вы можете построить объект, возможно, без параметров, установить 20 значений с помощью методов мутатора, а затем clone() объект, чтобы при необходимости сделать готовые копии. clone() вообще не нуждается в параметрах, поэтому он явно менее уродлив. Если вам нужно несколько копий нескольких разных версий этого объекта, то шаблон прототипа становится привлекательным.

person Ernest Friedman-Hill    schedule 29.07.2012

Шаблон проектирования прототипа используется, когда создание объектов требует слишком много системных ресурсов и производительности, и мы используем этот шаблон проектирования именно тогда, когда мы хотим иметь много экземпляров класса, и эти экземпляры похожи, поэтому мы действительно не хотим Чтобы использовать, например, оператор «новый», потому что он будет очень дорогостоящим, все, что нам нужно, - это создать экземпляры этих объектов на основе первого, уже созданного.

Преимущество состоит в том, что новый объект будет независимым, и для его создания в качестве первого не потребуется слишком много ресурсов. вот пример использования этой концепции в 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;
      }
}

}

основная программа:

  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);
    }

вывод :

original = Samsung@6d06d69c

copy = Samsung@7852e922

как вы видите, у этих объектов разные адреса, потому что они разные.

Примечание ! Я использовал название «Самсунг» только в качестве примера.

person Elmzabi Hassan    schedule 13.04.2018