Padrão de Projeto Protótipo em Java

O padrão de design de protótipo é um dos padrões de Design Criacional, portanto, fornece um mecanismo de criação de objeto.

Padrão de Design de Protótipo

O padrão de design de protótipo é usado quando a criação do Objeto é uma tarefa custosa e requer muito tempo e recursos e você já tem um objeto semelhante existente. O padrão de protótipo fornece um mecanismo para copiar o objeto original para um novo objeto e, em seguida, modificá-lo de acordo com nossas necessidades. O padrão de design de protótipo usa a clonagem do java para copiar o objeto.

Exemplo de Padrão de Design de Protótipo

Seria fácil entender o padrão de design de protótipo com um exemplo. Suponha que tenhamos um Objeto que carrega dados do banco de dados. Agora precisamos modificar esses dados em nosso programa várias vezes, então não é uma boa ideia criar o Objeto usando a palavra-chave new e carregar todos os dados novamente do banco de dados. A abordagem melhor seria clonar o objeto existente em um novo objeto e então manipular os dados. O padrão de design de protótipo exige que o Objeto que está sendo copiado forneça o recurso de cópia. Não deve ser feito por nenhuma outra classe. No entanto, se deve usar cópia superficial ou profunda das propriedades do Objeto depende dos requisitos e é uma decisão de design. Aqui está um programa de exemplo mostrando um exemplo do padrão de design de protótipo em 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(){
		//ler todos os funcionários do banco de dados e colocar na lista
		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);
	}
	
}

Observe que o método clone é substituído para fornecer uma cópia profunda da lista de funcionários. Aqui está o programa de teste de exemplo do padrão de design de protótipo que mostrará o benefício do padrão de protótipo. 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();
		
		//Use o método clone para obter o objeto 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);
	}

}

A saída do programa de exemplo do padrão de design de protótipo acima é:

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

Se a clonagem do objeto não fosse fornecida, teríamos que fazer chamadas ao banco de dados para buscar a lista de funcionários toda vez. Então fazer as manipulações que seriam consumidoras de recursos e tempo. Isso é tudo para o padrão de design de protótipo em Java.

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