Tìm hiểu Mẫu thiết kế Facade trong Java: Cách hoạt động và ví dụ minh họa
4 phút đọc23/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>Tìm hiểu Mẫu thiết kế Facade trong Java: Cách hoạt động và ví dụ minh họa - CyStack Tutorial</title>\n<meta name=\"description\" content=\"Mẫu thiết kế Facade cung cấp một giao diện thống nhất cho một tập hợp các giao diện trong một hệ thống con.\"/>\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/23/mau-thiet-ke-facade/\" />\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 Mẫu thiết kế Facade trong Java: Cách hoạt động và ví dụ minh họa - CyStack Tutorial\" />\n<meta property=\"og:description\" content=\"Mẫu thiết kế Facade cung cấp một giao diện thống nhất cho một tập hợp các giao diện trong một hệ thống con.\" />\n<meta property=\"og:url\" content=\"https://blog.cystack.org/tutorial/vi/2025/07/23/mau-thiet-ke-facade/\" />\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:32:29+07:00\" />\n<meta property=\"og:image\" content=\"https://s2.cystack.net/tutorial/23113957/mau-thiet-ke-facade.jpg\" />\n<meta property=\"og:image:secure_url\" content=\"https://s2.cystack.net/tutorial/23113957/mau-thiet-ke-facade.jpg\" />\n<meta property=\"og:image:width\" content=\"1200\" />\n<meta property=\"og:image:height\" content=\"630\" />\n<meta property=\"og:image:alt\" content=\"Mẫu thiết kế Facade trong Java\" />\n<meta property=\"og:image:type\" content=\"image/jpeg\" />\n<meta property=\"article:published_time\" content=\"2025-07-23T11:42:22+07:00\" />\n<meta property=\"article:modified_time\" content=\"2026-08-03T17:32:29+07:00\" />\n<meta name=\"twitter:card\" content=\"summary_large_image\" />\n<meta name=\"twitter:title\" content=\"Tìm hiểu Mẫu thiết kế Facade trong Java: Cách hoạt động và ví dụ minh họa - CyStack Tutorial\" />\n<meta name=\"twitter:description\" content=\"Mẫu thiết kế Facade cung cấp một giao diện thống nhất cho một tập hợp các giao diện trong một hệ thống con.\" />\n<meta name=\"twitter:image\" content=\"https://s2.cystack.net/tutorial/23113957/mau-thiet-ke-facade.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/23113957/mau-thiet-ke-facade.jpg\",\"url\":\"https://s2.cystack.net/tutorial/23113957/mau-thiet-ke-facade.jpg\",\"width\":\"1200\",\"height\":\"630\",\"caption\":\"M\\u1eabu thi\\u1ebft k\\u1ebf Facade trong Java\",\"inLanguage\":\"en-US\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/23/mau-thiet-ke-facade/#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/23/mau-thiet-ke-facade/\",\"name\":\"T\\u00ecm hi\\u1ec3u M\\u1eabu thi\\u1ebft k\\u1ebf Facade trong Java: C\\u00e1ch ho\\u1ea1t \\u0111\\u1ed9ng v\\u00e0 v\\u00ed d\\u1ee5 minh h\\u1ecda\"}}]},{\"@type\":\"WebPage\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/23/mau-thiet-ke-facade/#webpage\",\"url\":\"https://blog.cystack.org/tutorial/vi/2025/07/23/mau-thiet-ke-facade/\",\"name\":\"T\\u00ecm hi\\u1ec3u M\\u1eabu thi\\u1ebft k\\u1ebf Facade trong Java: C\\u00e1ch ho\\u1ea1t \\u0111\\u1ed9ng v\\u00e0 v\\u00ed d\\u1ee5 minh h\\u1ecda - CyStack Tutorial\",\"datePublished\":\"2025-07-23T11:42:22+07:00\",\"dateModified\":\"2026-08-03T17:32:29+07:00\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/#website\"},\"primaryImageOfPage\":{\"@id\":\"https://s2.cystack.net/tutorial/23113957/mau-thiet-ke-facade.jpg\"},\"inLanguage\":\"en-US\",\"breadcrumb\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/23/mau-thiet-ke-facade/#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 M\\u1eabu thi\\u1ebft k\\u1ebf Facade trong Java: C\\u00e1ch ho\\u1ea1t \\u0111\\u1ed9ng v\\u00e0 v\\u00ed d\\u1ee5 minh h\\u1ecda - CyStack Tutorial\",\"keywords\":\"m\\u1eabu thi\\u1ebft k\\u1ebf facade,Facade design pattern,Facade pattern,M\\u1eabu thi\\u1ebft k\\u1ebf Facade trong Java\",\"datePublished\":\"2025-07-23T11:42:22+07:00\",\"dateModified\":\"2026-08-03T17:32:29+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\":\"M\\u1eabu thi\\u1ebft k\\u1ebf Facade cung c\\u1ea5p m\\u1ed9t giao di\\u1ec7n th\\u1ed1ng nh\\u1ea5t cho m\\u1ed9t t\\u1eadp h\\u1ee3p c\\u00e1c giao di\\u1ec7n trong m\\u1ed9t h\\u1ec7 th\\u1ed1ng con.\",\"name\":\"T\\u00ecm hi\\u1ec3u M\\u1eabu thi\\u1ebft k\\u1ebf Facade trong Java: C\\u00e1ch ho\\u1ea1t \\u0111\\u1ed9ng v\\u00e0 v\\u00ed d\\u1ee5 minh h\\u1ecda - CyStack Tutorial\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/23/mau-thiet-ke-facade/#richSnippet\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/23/mau-thiet-ke-facade/#webpage\"},\"image\":{\"@id\":\"https://s2.cystack.net/tutorial/23113957/mau-thiet-ke-facade.jpg\"},\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/23/mau-thiet-ke-facade/#webpage\"}}]}</script>\n"}
Mẫu thiết kế Facade (Facade design pattern) là một trong những mẫu thiết kế thuộc nhóm cấu trúc (chẳng hạn như Adapter pattern và Decorator pattern). Nó được sử dụng để giúp các ứng dụng phía client dễ dàng tương tác với hệ thống.

Mẫu thiết kế Facade là gì?
Theo định nghĩa của GoF, mẫu thiết kế Facade:
Cung cấp một giao diện thống nhất cho một tập hợp các giao diện trong một hệ thống con. Facade Pattern định nghĩa một giao diện cấp cao hơn giúp cho hệ thống con dễ sử dụng hơn.
Giả sử chúng ta có một ứng dụng với tập hợp các giao diện để làm việc với cơ sở dữ liệu MySQL/Oracle và để tạo ra các loại báo cáo khác nhau như báo cáo HTML, báo cáo PDF, v.v. Khi đó, chúng ta sẽ có những tập giao diện khác nhau để làm việc với từng loại cơ sở dữ liệu. Ứng dụng phía client có thể sử dụng các giao diện này để lấy kết nối đến cơ sở dữ liệu cần thiết và tạo báo cáo.
Tuy nhiên, khi độ phức tạp tăng lên hoặc tên các hành vi trong giao diện gây nhầm lẫn, ứng dụng client sẽ gặp khó khăn trong việc quản lý. Vì vậy, chúng ta có thể áp dụng Facade design pattern để cung cấp một giao diện bao bọc (wrapper) bên trên các giao diện hiện có nhằm hỗ trợ ứng dụng client.
Mẫu thiết kế Facade – Tập hợp các giao diện
Chúng ta có thể có hai giao diện hỗ trợ, cụ thể là MySqlHelper và OracleHelper.
package com.journaldev.design.facade;
import java.sql.Connection;
public class MySqlHelper {
public static Connection getMySqlDBConnection(){
//get MySql DB connection using connection parameters
return null;
}
public void generateMySqlPDFReport(String tableName, Connection con){
//get data from table and generate pdf report
}
public void generateMySqlHTMLReport(String tableName, Connection con){
//get data from table and generate pdf report
}
}
package com.journaldev.design.facade;
import java.sql.Connection;
public class OracleHelper {
public static Connection getOracleDBConnection(){
//get Oracle DB connection using connection parameters
return null;
}
public void generateOraclePDFReport(String tableName, Connection con){
//get data from table and generate pdf report
}
public void generateOracleHTMLReport(String tableName, Connection con){
//get data from table and generate pdf report
}
}
Giao diện của mẫu thiết kế Facade
Chúng ta có thể tạo một giao diện cho Facade pattern như bên dưới. Lưu ý việc sử dụng Enum trong Java để đảm bảo tính an toàn kiểu dữ liệu (type safety).
package com.journaldev.design.facade;
import java.sql.Connection;
public class HelperFacade {
public static void generateReport(DBTypes dbType, ReportTypes reportType, String tableName){
Connection con = null;
switch (dbType){
case MYSQL:
con = MySqlHelper.getMySqlDBConnection();
MySqlHelper mySqlHelper = new MySqlHelper();
switch(reportType){
case HTML:
mySqlHelper.generateMySqlHTMLReport(tableName, con);
break;
case PDF:
mySqlHelper.generateMySqlPDFReport(tableName, con);
break;
}
break;
case ORACLE:
con = OracleHelper.getOracleDBConnection();
OracleHelper oracleHelper = new OracleHelper();
switch(reportType){
case HTML:
oracleHelper.generateOracleHTMLReport(tableName, con);
break;
case PDF:
oracleHelper.generateOraclePDFReport(tableName, con);
break;
}
break;
}
}
public static enum DBTypes{
MYSQL,ORACLE;
}
public static enum ReportTypes{
HTML,PDF;
}
}
Chương trình phía client sử dụng Mẫu thiết kế Facade
Bây giờ, hãy cùng xem mã phía client trong hai trường hợp: không sử dụng Facade pattern và sử dụng giao diện của Facade pattern.
package com.journaldev.design.test;
import java.sql.Connection;
import com.journaldev.design.facade.HelperFacade;
import com.journaldev.design.facade.MySqlHelper;
import com.journaldev.design.facade.OracleHelper;
public class FacadePatternTest {
public static void main(String[] args) {
String tableName="Employee";
//generating MySql HTML report and Oracle PDF report without using Facade
Connection con = MySqlHelper.getMySqlDBConnection();
MySqlHelper mySqlHelper = new MySqlHelper();
mySqlHelper.generateMySqlHTMLReport(tableName, con);
Connection con1 = OracleHelper.getOracleDBConnection();
OracleHelper oracleHelper = new OracleHelper();
oracleHelper.generateOraclePDFReport(tableName, con1);
//generating MySql HTML report and Oracle PDF report using Facade
HelperFacade.generateReport(HelperFacade.DBTypes.MYSQL, HelperFacade.ReportTypes.HTML, tableName);
HelperFacade.generateReport(HelperFacade.DBTypes.ORACLE, HelperFacade.ReportTypes.PDF, tableName);
}
}
Như bạn có thể thấy, việc sử dụng giao diện Facade pattern là cách đơn giản và rõ ràng hơn rất nhiều để tránh phải xử lý quá nhiều logic ở phía client. Lớp JDBC DriverManager dùng để lấy kết nối cơ sở dữ liệu là một ví dụ điển hình cho mẫu thiết kế Facade.
Những điểm quan trọng về Mẫu thiết kế Facade
- Mẫu thiết kế Facde giống như một thành phần hỗ trợ cho các ứng dụng phía client, nó không ẩn các giao diện của hệ thống con khỏi client. Việc có sử dụng Facade hay không hoàn toàn phụ thuộc vào mã phía client.
- Mẫu thiết kế Facade có thể được áp dụng tại bất kỳ thời điểm nào trong quá trình phát triển, thường là khi số lượng giao diện tăng lên và hệ thống trở nên phức tạp.
- Các giao diện của hệ thống con không biết đến sự tồn tại của Facade và không nên có bất kỳ tham chiếu nào đến giao diện Facade.
- Mẫu thiết kế Facade nên được áp dụng cho các giao diện có chức năng tương tự nhau; mục đích là để cung cấp một giao diện duy nhất thay vì nhiều giao diện thực hiện các công việc tương tự.
- Chúng ta có thể kết hợp Factory pattern với Facade để cung cấp giao diện tốt hơn cho hệ thống phía client.
->> Tìm hiểu thêm: Những design pattern thông dụng trong Java và ví dụ