Các mẫu thiết kế cấu trúc: Facade, Flyweight, và Proxy
Các mẫu thiết kế cấu trúc giúp bạn tổ chức các lớp (classes) và đối tượng (objects).
Hôm nay, chúng ta sẽ tìm hiểu ba mẫu cuối cùng để hoàn thiện bộ công cụ của bạn.
1. Mẫu Facade Facade đơn giản hóa các hệ thống phức tạp. Nó cung cấp một giao diện đơn giản cho một nhóm các lớp rắc rối.
Hãy tưởng tượng về một rạp chiếu phim. Để xem một bộ phim, bạn cần giảm độ sáng đèn, khởi động máy chiếu và mở rèm. Thay vì phải gọi năm hệ thống khác nhau, bạn chỉ cần gọi một phương thức: theater.watch_movie().
Sử dụng khi:
- Bạn muốn đơn giản hóa một hệ thống con phức tạp.
- Bạn cần một điểm truy cập duy nhất cho một API lớn.
- Bạn muốn tách biệt client khỏi logic nội bộ.
2. Mẫu Flyweight Flyweight giúp tiết kiệm bộ nhớ. Nó hoạt động hiệu quả khi bạn có hàng ngàn đối tượng tương tự nhau.
Thay vì lưu trữ mọi chi tiết trong mỗi đối tượng, bạn chia nhỏ dữ liệu. Bạn giữ dữ liệu dùng chung, không thay đổi (trạng thái nội tại - intrinsic state) ở một nơi. Bạn giữ dữ liệu riêng biệt (trạng thái ngoại lai - extrinsic state) tách rời.
Sử dụng khi:
- Việc sử dụng bộ nhớ là một vấn đề thực sự.
- Bạn quản lý hàng triệu đối tượng tương tự nhau, chẳng hạn như các ký tự trong một trình soạn thảo văn bản hoặc các hạt trong một trò chơi.
- Bạn muốn sử dụng object pooling để cải thiện hiệu suất.
3. Mẫu Proxy Proxy đóng vai trò là vật thay thế cho một đối tượng khác. Nó nằm giữa client và đối tượng thực để kiểm soát quyền truy cập.
Một proxy có thể:
- Lazy load: Chỉ tải các hình ảnh nặng khi người dùng nhấp vào chúng.
- Kiểm soát truy cập: Kiểm tra xem người dùng có quyền xóa cơ sở dữ liệu hay không.
- Ghi nhật ký hoạt động: Theo dõi ai đang sử dụng một dịch vụ cụ thể.
- Cache kết quả: Trả về dữ liệu đã lưu thay vì chạy các logic tốn kém.
Sử dụng khi:
- Bạn cần trì hoãn các hoạt động tốn kém.
- Bạn phải bảo vệ một dịch vụ nhạy cảm.
- Bạn muốn thêm tính năng ghi nhật ký hoặc bảo mật mà không cần thay đổi lớp ban đầu.
Bảng tóm tắt
• Adapter: Giúp các hệ thống không tương thích làm việc với nhau. • Bridge: Tách biệt phần trừu tượng khỏi phần triển khai. • Composite: Xây dựng các cấu trúc dạng cây. • Decorator: Thêm hành vi mà không cần sửa đổi các lớp. • Facade: Đơn giản hóa các hệ thống con phức tạp. • Flyweight: Chia sẻ dữ liệu để tiết kiệm bộ nhớ. • Proxy: Kiểm soát quyền truy cập vào các đối tượng.
Quy tắc vàng: Hãy sử dụng các mẫu này để giúp mã nguồn dễ bảo trì hơn. Đừng sử dụng chúng chỉ để thể hiện.
Tiếp theo, chúng ta sẽ bắt đầu chuỗi bài về Các mẫu thiết kế hành vi (Behavioral Design Patterns).