Mẫu thiết kế Factory trong Java là gì? Cách sử dụng hiệu quả
3 phút đọc07/07/2025
Về tác giả
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
{"success":true,"head":"<title>Mẫu thiết kế Factory trong Java là gì? Cách sử dụng hiệu quả - CyStack Tutorial</title>\n<meta name=\"description\" content=\"Tham khảo bài hướng dẫn này để biết cách sử dụng mẫu thiết kế Factory trong Java nhằm tách biệt quá trình khởi tạo đối tượng ra khỏi logic ứng dụng.\"/>\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/vi/2025/07/07/mau-thiet-ke-factory-trong-java/\" />\n<meta property=\"og:locale\" content=\"en_US\" />\n<meta property=\"og:type\" content=\"article\" />\n<meta property=\"og:title\" content=\"Mẫu thiết kế Factory trong Java là gì? Cách sử dụng hiệu quả - CyStack Tutorial\" />\n<meta property=\"og:description\" content=\"Tham khảo bài hướng dẫn này để biết cách sử dụng mẫu thiết kế Factory trong Java nhằm tách biệt quá trình khởi tạo đối tượng ra khỏi logic ứng dụng.\" />\n<meta property=\"og:url\" content=\"https://blog.cystack.org/tutorial/vi/2025/07/07/mau-thiet-ke-factory-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:updated_time\" content=\"2026-08-03T17:50:11+07:00\" />\n<meta property=\"og:image\" content=\"https://s2.cystack.net/tutorial/07165221/mau-thiet-ke-factory-trong-java-1024x538.jpg\" />\n<meta property=\"og:image:secure_url\" content=\"https://s2.cystack.net/tutorial/07165221/mau-thiet-ke-factory-trong-java-1024x538.jpg\" />\n<meta property=\"og:image:width\" content=\"1024\" />\n<meta property=\"og:image:height\" content=\"538\" />\n<meta property=\"og:image:alt\" content=\"Mẫu thiết kế Factory trong Java\" />\n<meta property=\"og:image:type\" content=\"image/jpeg\" />\n<meta property=\"article:published_time\" content=\"2025-07-07T16:53:00+07:00\" />\n<meta property=\"article:modified_time\" content=\"2026-08-03T17:50:11+07:00\" />\n<meta name=\"twitter:card\" content=\"summary_large_image\" />\n<meta name=\"twitter:title\" content=\"Mẫu thiết kế Factory trong Java là gì? Cách sử dụng hiệu quả - CyStack Tutorial\" />\n<meta name=\"twitter:description\" content=\"Tham khảo bài hướng dẫn này để biết cách sử dụng mẫu thiết kế Factory trong Java nhằm tách biệt quá trình khởi tạo đối tượng ra khỏi logic ứng dụng.\" />\n<meta name=\"twitter:image\" content=\"https://s2.cystack.net/tutorial/07165221/mau-thiet-ke-factory-trong-java-1024x538.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=\"4 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/07165221/mau-thiet-ke-factory-trong-java.jpg\",\"url\":\"https://s2.cystack.net/tutorial/07165221/mau-thiet-ke-factory-trong-java.jpg\",\"width\":\"2400\",\"height\":\"1260\",\"caption\":\"M\\u1eabu thi\\u1ebft k\\u1ebf Factory trong Java\",\"inLanguage\":\"en-US\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/07/mau-thiet-ke-factory-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/vi/category/java/\",\"name\":\"Java\"}},{\"@type\":\"ListItem\",\"position\":\"3\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/07/mau-thiet-ke-factory-trong-java/\",\"name\":\"M\\u1eabu thi\\u1ebft k\\u1ebf Factory trong Java l\\u00e0 g\\u00ec? C\\u00e1ch s\\u1eed d\\u1ee5ng hi\\u1ec7u qu\\u1ea3\"}}]},{\"@type\":\"WebPage\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/07/mau-thiet-ke-factory-trong-java/#webpage\",\"url\":\"https://blog.cystack.org/tutorial/vi/2025/07/07/mau-thiet-ke-factory-trong-java/\",\"name\":\"M\\u1eabu thi\\u1ebft k\\u1ebf Factory trong Java l\\u00e0 g\\u00ec? C\\u00e1ch s\\u1eed d\\u1ee5ng hi\\u1ec7u qu\\u1ea3 - CyStack Tutorial\",\"datePublished\":\"2025-07-07T16:53:00+07:00\",\"dateModified\":\"2026-08-03T17:50:11+07:00\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/#website\"},\"primaryImageOfPage\":{\"@id\":\"https://s2.cystack.net/tutorial/07165221/mau-thiet-ke-factory-trong-java.jpg\"},\"inLanguage\":\"en-US\",\"breadcrumb\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/07/mau-thiet-ke-factory-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\":\"M\\u1eabu thi\\u1ebft k\\u1ebf Factory trong Java l\\u00e0 g\\u00ec? C\\u00e1ch s\\u1eed d\\u1ee5ng hi\\u1ec7u qu\\u1ea3 - CyStack Tutorial\",\"keywords\":\"m\\u1eabu thi\\u1ebft k\\u1ebf Factory\",\"datePublished\":\"2025-07-07T16:53:00+07:00\",\"dateModified\":\"2026-08-03T17:50:11+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\":\"Tham kh\\u1ea3o b\\u00e0i h\\u01b0\\u1edbng d\\u1eabn n\\u00e0y \\u0111\\u1ec3 bi\\u1ebft c\\u00e1ch s\\u1eed d\\u1ee5ng m\\u1eabu thi\\u1ebft k\\u1ebf Factory trong Java nh\\u1eb1m t\\u00e1ch bi\\u1ec7t qu\\u00e1 tr\\u00ecnh kh\\u1edfi t\\u1ea1o \\u0111\\u1ed1i t\\u01b0\\u1ee3ng ra kh\\u1ecfi logic \\u1ee9ng d\\u1ee5ng.\",\"name\":\"M\\u1eabu thi\\u1ebft k\\u1ebf Factory trong Java l\\u00e0 g\\u00ec? C\\u00e1ch s\\u1eed d\\u1ee5ng hi\\u1ec7u qu\\u1ea3 - CyStack Tutorial\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/07/mau-thiet-ke-factory-trong-java/#richSnippet\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/07/mau-thiet-ke-factory-trong-java/#webpage\"},\"image\":{\"@id\":\"https://s2.cystack.net/tutorial/07165221/mau-thiet-ke-factory-trong-java.jpg\"},\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/07/mau-thiet-ke-factory-trong-java/#webpage\"}}]}</script>\n"}
Chào mừng bạn đến với bài hướng dẫn về mẫu thiết kế Factory trong Java. Đây là một trong những mẫu thiết kế thuộc nhóm khởi tạo (creational). Nó được sử dụng rộng rãi trong JDK cũng như trong các framework như Spring và Struts.

Mẫu thiết kế Factory
Mẫu thiết kế factory được sử dụng khi ta có một superclass (lớp cha) với nhiều subclass (lớp con) và cần trả về một trong các subclass đó dựa trên đầu vào. Mẫu này tách trách nhiệm khởi tạo thực thể của một class ra khỏi chương trình khách và chuyển cho Factory class.
Trước tiên, hãy cùng tìm hiểu cách triển khai mẫu thiết kế Factory trong Java, sau đó xem xét các ưu điểm và một vài ví dụ sử dụng nó trong JDK. Lưu ý rằng mẫu này còn có tên gọi khác là Factory Method.
Super class
Trong mẫu thiết kế này, super class có thể là một interface, một abstract class (lớp trừu tượng) hoặc một lớp Java thông thường. Với ví dụ trong bài, ta sẽ sử dụng một super class dạng trừu tượng có phương thức toString() được ghi đè để phục vụ việc kiểm thử.
package com.journaldev.design.model;
public abstract class Computer {
public abstract String getRAM();
public abstract String getHDD();
public abstract String getCPU();
@Override
public String toString(){
return "RAM= "+this.getRAM()+", HDD="+this.getHDD()+", CPU="+this.getCPU();
}
}
Subclass
Giả sử, ta có hai subclass là PC và Server như dưới đây.
package com.journaldev.design.model;
public class PC extends Computer {
private String ram;
private String hdd;
private String cpu;
public PC(String ram, String hdd, String cpu){
this.ram=ram;
this.hdd=hdd;
this.cpu=cpu;
}
@Override
public String getRAM() {
return this.ram;
}
@Override
public String getHDD() {
return this.hdd;
}
@Override
public String getCPU() {
return this.cpu;
}
}
Lưu ý rằng cả hai lớp này đều kế thừa từ super class Computer.
package com.journaldev.design.model;
public class Server extends Computer {
private String ram;
private String hdd;
private String cpu;
public Server(String ram, String hdd, String cpu){
this.ram=ram;
this.hdd=hdd;
this.cpu=cpu;
}
@Override
public String getRAM() {
return this.ram;
}
@Override
public String getHDD() {
return this.hdd;
}
@Override
public String getCPU() {
return this.cpu;
}
}
Factory class
Khi đã có super class và các subclass, chúng ta có thể bắt đầu viết Factory class. Dưới đây là một triển khai cơ bản.
package com.journaldev.design.factory;
import com.journaldev.design.model.Computer;
import com.journaldev.design.model.PC;
import com.journaldev.design.model.Server;
public class ComputerFactory {
public static Computer getComputer(String type, String ram, String hdd, String cpu){
if("PC".equalsIgnoreCase(type)) return new PC(ram, hdd, cpu);
else if("Server".equalsIgnoreCase(type)) return new Server(ram, hdd, cpu);
return null;
}
}
Một vài điểm quan trọng đáng chú ý của mẫu thiết kế Factory là:
- Lớp Factory có thể được viết theo mẫu Singleton, hoặc phương thức trả về subclass có thể được khai báo là
static.
- Tùy vào tham số đầu vào, một đối tượng subclass tương ứng sẽ tạo và trả về.
getComputer là một ví dụ về Factory method.
<img>
Dưới đây là một chương trình client (bên sử dụng lớp, hàm, đối tượng) đơn giản để kiểm tra triển khai mẫu thiết kế Factory ở trên.
package com.journaldev.design.test;
import com.journaldev.design.factory.ComputerFactory;
import com.journaldev.design.model.Computer;
public class TestFactory {
public static void main(String[] args) {
Computer pc = ComputerFactory.getComputer("pc","2 GB","500 GB","2.4 GHz");
Computer server = ComputerFactory.getComputer("server","16 GB","1 TB","2.9 GHz");
System.out.println("Factory PC Config::"+pc);
System.out.println("Factory Server Config::"+server);
}
}
Kết quả của chương trình trên là:
Factory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHz
Factory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz
Ưu điểm của mẫu thiết kế Factory
- Mẫu này cung cấp cách tiếp cận lập trình hướng về interface thay vì triển khai.
- Mẫu này tách việc khởi tạo các triển khai lớp cụ thể ra khỏi code của client. Điều này giúp code của chúng ta giảm phụ thuộc và dễ mở rộng hơn. Ví dụ, ta có thể dễ dàng thay đổi triển khai của class PC vì chương trình client không hề biết về sự thay đổi này.
- Mẫu này cung cấp một lớp trừu tượng giữa triển khai và client thông qua tính kế thừa.
Ví dụ về mẫu thiết kế Factory trong JDK
- Các phương thức
getInstance() trong java.util.Calendar, ResourceBundle và NumberFormat đều sử dụng mẫu Factory.
- Phương thức
valueOf() trong các lớp bọc như Boolean, Integer, v.v.
Tổng kết
Bạn có thể tải code ví dụ trên từ link này. Sau khi tìm hiểu về mẫu thiết kế Factory, bạn có thể linh hoạt tạo các đối tượng dựa trên yêu cầu mà không cần sửa đổi phía client. Đây là yếu tốt quan trọng để bạn có thể viết code có tính mở rộng cao và dễ dàng bảo trì hơn.