Паттерн «Прототип» в JAVA

Паттерны   18 декабря 2012  Автор статьи:  

В данной статье мы рассмотрим паттерн «Прототип». Суть данного паттерна в клонировании объекта с целью уменьшения стоимости создания нового объекта. Prototype имеет смысл применять в следующих случаях:

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

Чтобы использовать паттерн Прототип для какого — то класса необходимо реализовать интерфейс Cloneable. После этого, вы будете использовать метод clone для создания нового объекта, вместо того, чтобы каждый раз создавать новый объект с помощью оператора new.
Рассмотрим следующий пример. Пусть у нас есть некоторая поисковая система, которая обрабатывает какие — то сложные запросы. Каждый раз, для того, чтобы получить результат мы отдаем ей на вход некоторый объект класса Request, который содержит поля, по которым выполняется сортировка и поиск. Для простоты примера наша система будет принимать запросы следующего вида:

public class Request {
private String clientName;//имя клиента
private int Age;//возраст
private String job;//запрашиваемая работа
}

Понятное дело, что таких запросов будет достаточно много, а различаться они будут только лишь набором каких — то значений, тогда чтобы сэкономить на создании запросов реализуем для него интерфейс cloneable и дадим возможность изменять значения полей:

public class Request implements Cloneable {
private String clientName;
private int Age;
private String job;

public Request(String clientName, int age, String job) {
this.clientName = clientName;
Age = age;
this.job = job;
}

public String getClientName() {
return clientName;
}

public void setClientName(String clientName) {
this.clientName = clientName;
}

public int getAge() {
return Age;
}

public void setAge(int age) {
Age = age;
}

public String getJob() {
return job;
}

public void setJob(String job) {
this.job = job;
}

public Request clone() throws CloneNotSupportedException {
return (Request) super.clone();
}
}

Ну и сама суть Prototype Design Pattern:

public class Solution {
public static void main(String[] args) {
Request request = new Request("lordrp", 20, "coder");
while (true)//имитирую онлайн запросы
{
try {
Request userRequest = request.clone();
//изменение параметров
userRequest.setAge(30);
//тут мог бы осуществляться какой - нить поиск
//search(userRequest)
} catch (CloneNotSupportedException e) {
e.printStackTrace();//объект не поддерживает клонирование
}
}
}
}

Научиться программировать

  • на Delphi

  • на Java

  • на C++