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

Я проходил через шаблон дизайна java и получил некоторые сомнения / вопросы прототипа Шаблона дизайна. Сначала позвольте мне сказать то, что я понял. Шаблон проектирования прототипа используется для создания объектов это затратно с точки зрения памяти или ресурсов. Поэтому в этом случае мы используем клон того объекта, который уже доступен. Так в чем же разница между созданием нового объекта и clone()? Где объект хранится в памяти ?

3 ответов


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

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

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


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

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


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

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

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

внимание ! я использовал название "Samsung" только в качестве примера.