Tìm hiểu Prototype Pattern trong Java: Khái niệm & Cách triển khai
3 phút đọc23/08/2025
Bao Tran
Web Developer
0 lượt xem
0 lượt xem
Reading Time: 3minutes
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 empList;
public Employees(){
empList = new ArrayList();
}
public Employees(List 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 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);
}
}
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 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);
}
}
****Kết quả đầu ra của chương trình ví dụ mẫu thiết kế Prototype trên là:
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.
Về tác giả
Bao TranWeb Developer
I’m passionate about web development and sharing my insights through articles, with over 8 years of experience. I hope these sharings inspire you and help build a strong web development community.
@#@
Tôi đam mê phát triển web và chia sẻ những hiểu biết của mình thông qua các bài viết, với hơn 8 năm kinh nghiệm. Tôi hy vọng những chia sẻ này sẽ truyền cảm hứng cho các bạn và giúp xây dựng một cộng đồng phát triển web mạnh mẽ.
Cập nhật thông tin mới nhấtNhận các thông tin mới nhất về mối đe dọa, báo cáo an ninh mạng từ CyStack về hòm thư điện tử của bạn
Thảo luận (0)
Đăng nhập để thảo luận
Bài viết liên quan
{"success":true,"head":"<title>Tìm hiểu Prototype Pattern trong Java: Khái niệm & Cách triển khai - CyStack Tutorial</title>\n<meta name=\"description\" content=\"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.\"/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-video-preview:-1, max-image-preview:large\"/>\n<link rel=\"canonical\" href=\"https://blog.cystack.org/tutorial/2025/08/23/prototype-pattern-trong-java/\" />\n<meta property=\"og:locale\" content=\"en_US\" />\n<meta property=\"og:type\" content=\"article\" />\n<meta property=\"og:title\" content=\"Tìm hiểu Prototype Pattern trong Java: Khái niệm & Cách triển khai - CyStack Tutorial\" />\n<meta property=\"og:description\" content=\"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.\" />\n<meta property=\"og:url\" content=\"https://blog.cystack.org/tutorial/2025/08/23/prototype-pattern-trong-java/\" />\n<meta property=\"og:site_name\" content=\"CyStack Tutorial\" />\n<meta property=\"article:tag\" content=\"vi\" />\n<meta property=\"article:section\" content=\"Java\" />\n<meta property=\"og:image\" content=\"https://s2.cystack.net/tutorial/23175130/prototype-pattern-trong-java.jpg\" />\n<meta property=\"og:image:secure_url\" content=\"https://s2.cystack.net/tutorial/23175130/prototype-pattern-trong-java.jpg\" />\n<meta property=\"og:image:width\" content=\"1200\" />\n<meta property=\"og:image:height\" content=\"630\" />\n<meta property=\"og:image:alt\" content=\"prototype-pattern-trong-java\" />\n<meta property=\"og:image:type\" content=\"image/jpeg\" />\n<meta property=\"article:published_time\" content=\"2025-08-23T17:52:08+07:00\" />\n<meta name=\"twitter:card\" content=\"summary_large_image\" />\n<meta name=\"twitter:title\" content=\"Tìm hiểu Prototype Pattern trong Java: Khái niệm & Cách triển khai - CyStack Tutorial\" />\n<meta name=\"twitter:description\" content=\"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.\" />\n<meta name=\"twitter:image\" content=\"https://s2.cystack.net/tutorial/23175130/prototype-pattern-trong-java.jpg\" />\n<meta name=\"twitter:label1\" content=\"Written by\" />\n<meta name=\"twitter:data1\" content=\"Bao Tran\" />\n<meta name=\"twitter:label2\" content=\"Time to read\" />\n<meta name=\"twitter:data2\" content=\"3 minutes\" />\n<script type=\"application/ld+json\" class=\"rank-math-schema\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https://blog.cystack.org/tutorial/#person\",\"name\":\"CyStack Tutorial\"},{\"@type\":\"WebSite\",\"@id\":\"https://blog.cystack.org/tutorial/#website\",\"url\":\"https://blog.cystack.org/tutorial\",\"name\":\"CyStack Tutorial\",\"publisher\":{\"@id\":\"https://blog.cystack.org/tutorial/#person\"},\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https://s2.cystack.net/tutorial/23175130/prototype-pattern-trong-java.jpg\",\"url\":\"https://s2.cystack.net/tutorial/23175130/prototype-pattern-trong-java.jpg\",\"width\":\"1200\",\"height\":\"630\",\"caption\":\"prototype-pattern-trong-java\",\"inLanguage\":\"en-US\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://blog.cystack.org/tutorial/2025/08/23/prototype-pattern-trong-java/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":\"1\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":\"2\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial/category/java/\",\"name\":\"Java\"}},{\"@type\":\"ListItem\",\"position\":\"3\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial/2025/08/23/prototype-pattern-trong-java/\",\"name\":\"T\\u00ecm hi\\u1ec3u Prototype Pattern trong Java: Kh\\u00e1i ni\\u1ec7m & C\\u00e1ch tri\\u1ec3n khai\"}}]},{\"@type\":\"WebPage\",\"@id\":\"https://blog.cystack.org/tutorial/2025/08/23/prototype-pattern-trong-java/#webpage\",\"url\":\"https://blog.cystack.org/tutorial/2025/08/23/prototype-pattern-trong-java/\",\"name\":\"T\\u00ecm hi\\u1ec3u Prototype Pattern trong Java: Kh\\u00e1i ni\\u1ec7m & C\\u00e1ch tri\\u1ec3n khai - CyStack Tutorial\",\"datePublished\":\"2025-08-23T17:52:08+07:00\",\"dateModified\":\"2025-08-23T17:52:08+07:00\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/#website\"},\"primaryImageOfPage\":{\"@id\":\"https://s2.cystack.net/tutorial/23175130/prototype-pattern-trong-java.jpg\"},\"inLanguage\":\"en-US\",\"breadcrumb\":{\"@id\":\"https://blog.cystack.org/tutorial/2025/08/23/prototype-pattern-trong-java/#breadcrumb\"}},{\"@type\":\"Person\",\"@id\":\"https://blog.cystack.org/tutorial/author/baotran/\",\"name\":\"Bao Tran\",\"url\":\"https://blog.cystack.org/tutorial/author/baotran/\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https://secure.gravatar.com/avatar/0cdd33c02ec4a531fcf557b9c1ccc276df0c69031b2382c959bcf335248e840c?s=96&d=mm&r=g\",\"url\":\"https://secure.gravatar.com/avatar/0cdd33c02ec4a531fcf557b9c1ccc276df0c69031b2382c959bcf335248e840c?s=96&d=mm&r=g\",\"caption\":\"Bao Tran\",\"inLanguage\":\"en-US\"}},{\"@type\":\"BlogPosting\",\"headline\":\"T\\u00ecm hi\\u1ec3u Prototype Pattern trong Java: Kh\\u00e1i ni\\u1ec7m & C\\u00e1ch tri\\u1ec3n khai - CyStack Tutorial\",\"keywords\":\"Prototype pattern,m\\u1eabu thi\\u1ebft k\\u1ebf Prototype,Prototype pattern trong Java\",\"datePublished\":\"2025-08-23T17:52:08+07:00\",\"dateModified\":\"2025-08-23T17:52:08+07:00\",\"articleSection\":\"Java\",\"author\":{\"@id\":\"https://blog.cystack.org/tutorial/author/baotran/\",\"name\":\"Bao Tran\"},\"publisher\":{\"@id\":\"https://blog.cystack.org/tutorial/#person\"},\"description\":\"Prototype Pattern \\u0111\\u01b0\\u1ee3c s\\u1eed d\\u1ee5ng khi vi\\u1ec7c t\\u1ea1o \\u0111\\u1ed1i t\\u01b0\\u1ee3ng t\\u1ed1n k\\u00e9m v\\u00e0 \\u0111\\u00f2i h\\u1ecfi nhi\\u1ec1u th\\u1eddi gian, t\\u00e0i nguy\\u00ean, v\\u00e0 b\\u1ea1n \\u0111\\u00e3 c\\u00f3 m\\u1ed9t \\u0111\\u1ed1i t\\u01b0\\u1ee3ng t\\u01b0\\u01a1ng t\\u1ef1 t\\u1ed3n t\\u1ea1i.\",\"name\":\"T\\u00ecm hi\\u1ec3u Prototype Pattern trong Java: Kh\\u00e1i ni\\u1ec7m & C\\u00e1ch tri\\u1ec3n khai - CyStack Tutorial\",\"@id\":\"https://blog.cystack.org/tutorial/2025/08/23/prototype-pattern-trong-java/#richSnippet\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/2025/08/23/prototype-pattern-trong-java/#webpage\"},\"image\":{\"@id\":\"https://s2.cystack.net/tutorial/23175130/prototype-pattern-trong-java.jpg\"},\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https://blog.cystack.org/tutorial/2025/08/23/prototype-pattern-trong-java/#webpage\"}}]}</script>\n"}