Шаблон Прототип в Java

Шаблон проектирования прототипа – это один из шаблонов создания объектов, поэтому он предоставляет механизм создания объекта.

Шаблон проектирования прототипа

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

Пример шаблона проектирования прототипа

Было бы легко понять паттерн проектирования прототипа на примере. Предположим, у нас есть объект, который загружает данные из базы данных. Теперь нам нужно изменить эти данные в нашей программе несколько раз, поэтому создавать объект с использованием ключевого слова new и снова загружать все данные из базы данных не очень хорошая идея. Лучшим подходом будет клонировать существующий объект в новый объект, а затем выполнять манипуляции с данными. Паттерн проектирования прототипа требует, чтобы объект, который вы копируете, предоставлял возможность копирования. Это не должно делаться любым другим классом. Однако решение о том, использовать поверхностное или глубокое копирование свойств объекта, зависит от требований, и это решение дизайна. Вот пример программы, демонстрирующий паттерн проектирования прототипа на языке Java. Employees.java

package com.journaldev.design.prototype;

import java.util.ArrayList;
import java.util.List;

public class Employees implements Cloneable{

	private List empList;
	
	public Employees(){
		empList = new ArrayList();
	}
	
	public Employees(List list){
		this.empList=list;
	}
	public void loadData(){
		//считывает всех сотрудников из базы данных и помещает их в список
		empList.add("Pankaj");
		empList.add("Raj");
		empList.add("David");
		empList.add("Lisa");
	}
	
	public List getEmpList() {
		return empList;
	}

	@Override
	public Object clone() throws CloneNotSupportedException{
			List temp = new ArrayList();
			for(String s : this.getEmpList()){
				temp.add(s);
			}
			return new Employees(temp);
	}
	
}

Обратите внимание, что метод clone переопределен для предоставления глубокой копии списка сотрудников. Вот пример тестовой программы для паттерна проектирования прототипа, который покажет преимущества этого паттерна. PrototypePatternTest.java

package com.journaldev.design.test;

import java.util.List;

import com.journaldev.design.prototype.Employees;

public class PrototypePatternTest {

	public static void main(String[] args) throws CloneNotSupportedException {
		Employees emps = new Employees();
		emps.loadData();
		
		//Используйте метод clone для получения объекта Employee
		Employees empsNew = (Employees) emps.clone();
		Employees empsNew1 = (Employees) emps.clone();
		List list = empsNew.getEmpList();
		list.add("John");
		List list1 = empsNew1.getEmpList();
		list1.remove("Pankaj");
		
		System.out.println("emps List: "+emps.getEmpList());
		System.out.println("empsNew List: "+list);
		System.out.println("empsNew1 List: "+list1);
	}

}

Результатом вышеуказанной программы примера паттерна проектирования прототипа является:

emps List: [Pankaj, Raj, David, Lisa]
empsNew List: [Pankaj, Raj, David, Lisa, John]
empsNew1 List: [Raj, David, Lisa]

Если бы клонирование объектов не было предусмотрено, нам пришлось бы делать вызов базы данных для получения списка сотрудников каждый раз. Затем выполнить манипуляции, которые были бы затратными по ресурсам и времени. Вот и все для паттерна проектирования прототипа на языке Java.

Source:
https://www.digitalocean.com/community/tutorials/prototype-design-pattern-in-java