Facade Design Pattern in Java

1. Giới thiệu

Facade Design Pattern là một phần của mẫu thiết kế Gang of Four và nó thuộc loại Structural design patterns (Mẫu thiết kế cấu trúc). Trước khi tìm hiểu chi tiết về nó, chúng ta hãy thảo luận về một số ví dụ sẽ được giải quyết bằng pattern cụ thể này.
Như tên cho thấy, nó có nghĩa là bộ mặt của tòa nhà. Những người đi qua đường chỉ có thể nhìn thấy mặt kính này của tòa nhà. Họ không biết gì về nó, hệ thống dây điện, đường ống và những thứ phức tạp khác. Nó che giấu tất cả sự phức tạp của tòa nhà và hiển thị một bộ mặt thân thiện.

2. Các ví dụ

Trong Java, giao diện JDBC có thể được gọi là Facade bởi vì với tư cách là người dùng hoặc client tạo kết nối bằng giao diện "java.sql.Connection", việc implement chúng ta không quan tâm. Việc implement được để cho nhà cung cấp trình điều khiển.
Một ví dụ điển hình khác có thể là việc khởi động máy tính. Khi một máy tính khởi động, nó liên quan đến công việc của cpu, bộ nhớ, ổ cứng, v.v. Để giúp người dùng dễ sử dụng, chúng ta có thể thêm một mặt facade bao hàm sự phức tạp của tác vụ và thay vào đó cung cấp một giao diện đơn giản.
Tương tự đối với Facade Design Pattern. Nó che giấu sự phức tạp của hệ thống và cung cấp một giao diện cho máy khách để từ đó máy khách có thể truy cập vào hệ thống.
Facade Design Pattern Diagram
Chúng ta hãy thử và hiểu rõ hơn về Facade Design Pattern bằng một ví dụ đơn giản. Xét ví dụ một khách sạn: Khách sạn này có một nhân viên và có rất nhiều nhà hàng bên trong khách sạn, ví dụ: Nhà hàng chay (VegRestaurant), nhà hàng không ăn chay (NonVegRestaurant) và nhà hàng có cả 2 loại (VegNonBothRestaurant). Bạn với tư cách là khách hàng muốn truy cập vào các menu khác nhau của các nhà hàng khác nhau. Bạn không biết họ có những menu khác nhau là gì. Bạn chỉ có thể tiếp cận với nhân viên khách sạn, người biết rõ về khách sạn của mình. Bất cứ thực đơn nào bạn muốn, bạn hãy nói với người nhân viên khách sạn đó và anh ta sẽ mang nó ra khỏi các nhà hàng tương ứng và giao cho bạn. Ở đây, người nhân viên khách sạn đóng vai trò là Facade, vì anh ta che giấu sự phức tạp của hệ thống order món trong khách sạn.

3. Implementation

Bây giờ, chúng ta hãy cùng xem cách để implement mẫu thiết kế Facade thông qua ví dụ trên:
Hotel class:

package structural.facade; 
public interface Hotel 
{ 
    public Menus getMenus(); 
} 

Hotel interface chỉ trả về Menu. Tương tự, Restaurant có ba loại và có thể thực hiện Hotel interface:
NonVegRestaurant class

package structural.facade; 
  
public class NonVegRestaurant implements Hotel 
{ 
    public Menus getMenus() 
    { 
        NonVegMenu nv = new NonVegMenu(); 
        return nv; 
    } 
} 

VegRestaurant

package structural.facade; 

public class VegRestaurant implements Hotel 
{ 
	public Menus getMenus() 
	{ 
		VegMenu v = new VegMenu(); 
		return v; 
	} 
} 

VegNonBothRestaurant class

package structural.facade; 

public class VegNonBothRestaurant implements Hotel 
{ 
	public Menus getMenus() 
	{ 
		Both b = new Both(); 
		return b; 
	} 
} 

Class HotelKeeper đại diện cho đối tượng facade:

package structural.facade; 

public class HotelKeeper 
{ 
	public VegMenu getVegMenu() 
	{ 
		VegRestaurant v = new VegRestaurant(); 
		VegMenu vegMenu = (VegMenu)v.getMenus(); 
		return vegMenu; 
	} 
	
	public NonVegMenu getNonVegMenu() 
	{ 
		NonVegRestaurant v = new NonVegRestaurant(); 
		NonVegMenu NonvegMenu = (NonVegMenu)v.getMenus(); 
		return NonvegMenu; 
	} 
	
	public Both getVegNonMenu() 
	{ 
		VegNonBothRestaurant v = new VegNonBothRestaurant(); 
		Both bothMenu = (Both)v.getMenus(); 
		return bothMenu; 
	}	 
} 

Từ đây, rõ ràng là việc implement phức tạp sẽ được thực hiện bởi chính HotelKeeper. Client sẽ chỉ cần truy cập vào HotelKeeper và yêu cầu thực đơn Nhà hàng Veg, NonVeg hoặc VegNon Both.
Dưới đây là main method, cách sử dụng mẫu Facade trên:

package structural.facade; 
  
public class Client 
{ 
    public static void main (String[] args) 
    { 
        HotelKeeper keeper = new HotelKeeper(); 
          
        VegMenu v = keeper.getVegMenu(); 
        NonVegMenu nv = keeper.getNonVegMenu(); 
        Both = keeper.getVegNonMenu(); 
  
    } 
} 

Bằng cách này, việc implement được gửi đến facade. Client chỉ được cung cấp một interface và chỉ có thể truy cập vào interface đó. Điều này sẽ là ẩn tất cả những phức tạp bên trong nó.

4. Khi nào sử dụng Facade Pattern

  • Facade Pattern thích hợp khi bạn có một hệ thống phức tạp mà bạn muốn hiển thị với client một cách đơn giản hoặc bạn muốn tạo một interface bên ngoài trên một hệ thống hiện có mà nó không tương thích với hệ thống. Mục đích của nó là để che giấu sự phức tạp bên trong đằng sau một giao diện duy nhất có vẻ đơn giản ở bên ngoài.
  • Khi người sử dụng phụ thuộc nhiều vào các lớp cài đặt. Việc áp dụng Facade Pattern sẽ tách biệt hệ thống con của người dùng và các hệ thống con khác, do đó tăng khả năng độc lập và khả chuyển của hệ thống con.
  • Khi bạn muốn phân lớp các hệ thống con. Dùng Facade Pattern để định nghĩa cổng giao tiếp chung cho mỗi hệ thống con, do đó giúp giảm sự phụ thuộc của các hệ thống con vì các hệ thống này chỉ giao tiếp với nhau thông qua các cổng giao diện chung đó.

6. Câu hỏi thường gặp

Ưu điểm của mẫu thiết kế facade

  • Hãy nhớ facade không làm giảm sự phức tạp. Nó chỉ ẩn nó khỏi các hệ thống và máy khách bên ngoài. Vì vậy, người hưởng lợi chính của các mẫu facade chỉ là các ứng dụng client và các hệ thống khác.
  • Nó cung cấp một giao diện đơn giản cho các máy client, tức là thay vì trình bày các hệ thống con phức tạp, chúng giới thiệu một giao diện đơn giản cho các máy khách. Nó cũng có thể giúp chúng ta giảm số lượng đối tượng mà client cần xử lý.

Facade không hạn chế quyền truy cập vào các hệ thống con

  • Một facade không đóng gói các lớp hoặc interface của hệ thống con. Nó chỉ cung cấp một interface (hoặc lớp) đơn giản để giúp mọi thứ của chúng ta xử lý dễ dàng hơn.

Facade pattern vs adapter pattern

  • Trong adapter pattern, chúng ta cố gắng thay đổi interface để client có thể làm việc với hệ thống. Nếu không hệ thống sẽ khó sử dụng (thậm chí không thể sử dụng được).
  • Còn facade pattern đơn giản hóa interface. Nó giới thiệu cho client một interface đơn giản để tương tác (thay vì một hệ thống con phức tạp).

Chỉ có 1 facade cho một hệ thống con phức tạp?

  • Không hề, chúng ta có thể tạo bất kỳ số lượng facade nào cho một hệ thống con phức tạp cụ thể. Ý tưởng là làm cho hệ thống dễ sử dụng hơn.

Những thách thức với facade pattern

  • Các hệ thống con được kết nối với lớp facade. Vì vậy, bạn cần quan tâm đến một lớp mã hóa bổ sung.
  • Khi cấu trúc bên trong của một hệ thống con thay đổi, bạn cũng cần phải kết hợp các thay đổi trong tầng facade.

5. Tham khảo

Facade Design Pattern | Introduction - Geeksforgeeks
Facade Design Pattern - HowToDoInJava


All Rights Reserved