Javaでのプロトタイプデザインパターン

プロトタイプデザインパターンは、生成型デザインパターンの1つであり、オブジェクトの作成メカニズムを提供します。

プロトタイプデザインパターン

オブジェクトの作成が費用と時間とリソースを要する場合、かつ既に類似のオブジェクトが存在する場合に、プロトタイプパターンが使用されます。プロトタイプパターンは、元のオブジェクトを新しいオブジェクトにコピーし、必要に応じて変更するメカニズムを提供します。プロトタイプデザインパターンは、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