プロトタイプデザインパターンは、生成型デザインパターンの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