Prototype pattern (mẫu thiết kế Prototype) là một trong những mẫu thiết kế tạo dựng (Creational design pattern), do đó nó cung cấp một cơ chế để tạo đối tượng.
Prototype Pattern trong Java
Prototype Pattern được sử dụng khi việc tạo đối tượng tốn kém và đòi hỏi nhiều thời gian, tài nguyên, và bạn đã có một đối tượng tương tự tồn tại. Mẫu Prototype cung cấp một cơ chế để sao chép đối tượng gốc sang một đối tượng mới và sau đó sửa đổi nó theo mong muốn của chúng ta. Mẫu thiết kế Prototype sử dụng Java cloning để sao chép đối tượng.
Ví dụ về mẫu thiết kế Prototype Sẽ dễ hiểu hơn về mẫu thiết kế Prototype với một ví dụ. Giả sử chúng ta có một đối tượng tải dữ liệu từ cơ sở dữ liệu. Bây giờ chúng ta cần sửa đổi dữ liệu này nhiều lần trong chương trình của mình, vì vậy việc tạo đối tượng bằng từ khóa new
và tải lại tất cả dữ liệu từ cơ sở dữ liệu là không hay. Cách tiếp cận tốt hơn là sao chép (clone) đối tượng hiện có sang một đối tượng mới và sau đó thao tác dữ liệu.
Mẫu thiết kế Prototype yêu cầu rằng đối tượng mà bạn đang sao chép phải cung cấp tính năng sao chép. Việc này không nên được thực hiện bởi bất kỳ lớp nào khác. Tuy nhiên, việc sử dụng shallow copy (sao chép nông) hay deep copy (sao chép sâu) các thuộc tính của đối tượng phụ thuộc vào yêu cầu và đó là một quyết định thiết kế.
Dưới đây là một chương trình mẫu minh họa ví dụ về mẫu thiết kế Prototype trong Java: Employees.java
package com.journaldev.design.prototype;
import java.util.ArrayList;
import java.util.List;
public class Employees implements Cloneable{
private List<String> empList;
public Employees(){
empList = new ArrayList<String>();
}
public Employees(List<String> list){
this.empList=list;
}
public void loadData(){
//read all employees from database and put into the list
empList.add("Pankaj");
empList.add("Raj");
empList.add("David");
empList.add("Lisa");
}
public List<String> getEmpList() {
return empList;
}
@Override
public Object clone() throws CloneNotSupportedException{
List<String> temp = new ArrayList<String>();
for(String s : this.getEmpList()){
temp.add(s);
}
return new Employees(temp);
}
}
Lưu ý rằng phương thức clone được ghi đè để cung cấp một bản deep copy của danh sách nhân viên. Dưới đây là chương trình kiểm tra ví dụ về mẫu thiết kế Prototype sẽ cho thấy lợi ích của mẫu này: 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 the clone method to get the Employee object
Employees empsNew = (Employees) emps.clone();
Employees empsNew1 = (Employees) emps.clone();
List<String> list = empsNew.getEmpList();
list.add("John");
List<String> 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);
}
}
****Kết quả đầu ra của chương trình ví dụ mẫu thiết kế Prototype trên là:
emps List: [Pankaj, Raj, David, Lisa]
empsNew List: [Pankaj, Raj, David, Lisa, John]
empsNew1 List: [Raj, David, Lisa]
Nếu tính năng cloning đối tượng không được cung cấp, chúng ta sẽ phải thực hiện cuộc gọi đến cơ sở dữ liệu để tìm nạp danh sách nhân viên mỗi lần. Sau đó, việc thực hiện các thao tác sẽ tốn tài nguyên và thời gian.
Chúng ta đã hoàn thành xong việc tìm hiểu về mẫu thiết kế Prototype trong Java.