Design Pattern thường dùng – Ưu nhược điểm?

5/5 - (1 bình chọn)

Design Pattern là các giải pháp mẫu chuẩn tối ưu, được tái sử dụng cho các vấn đề phổ biến trong thiết kế phần mềm. Các design pattern thường dùng dưới đây sẽ là công cụ hỗ trợ tuyệt vời để giúp các lập trình viên giải quyết các vấn đề phát sinh một cách nhanh nhất.

1. Strategy Design Pattern

design-pattern-thuong-dung-strategy
Strategy Design Pattern

Strategy Pattern là một trong những Design Pattern thường dùng thuộc nhóm hành vi (Behavior Pattern). Nó cho phép định nghĩa tập hợp các thuật toán, đóng gói từng thuật toán lại, và dễ dàng thay đổi linh hoạt các thuật toán bên trong object. Strategy cho phép thuật toán biến đổi độc lập khi người dùng sử dụng chúng.

Ý nghĩa của Strategy Pattern là giúp tách rời phần xử lý một chức năng cụ thể ra khỏi đối tượng. Sau đó tạo ra một tập hợp các thuật toán để xử lý chức năng đó và lựa chọn thuật toán nào mà chúng ta thấy đúng đắn nhất khi thực thi chương trình. 

Mẫu thiết kế này thường được sử dụng để thay thế cho sự kế thừa, khi muốn chấm dứt việc theo dõi và chỉnh sửa một chức năng qua nhiều lớp con.

Strategy Pattern được áp dụng khi:

  • Chúng ta có thể thấy kiểu design phù hợp cho trường hợp cần có nhiều kiểu xử lý cho một yêu cầu nào đó, và có thể thay đổi chúng trong runtime
  • Có nhiều class tương tự nhau nhưng khác nhau về ở một vài xử lý nào đó. Tính giá sản phẩm ở trên là một ví dụ
  • Tách logic xử lý của một class nào đó và ẩn nó trong một class mới

Ưu điểm:

  • Một thuật toán có thể được định nghĩa như một hệ thống phân cấp lớp và có thể được sử dụng thay thế cho nhau để thay đổi hành vi ứng dụng mà không thay đổi kiến ​​trúc của nó.
  • Bằng cách đóng gói riêng biệt thuật toán, các thuật toán mới tuân theo cùng một giao diện có thể dễ dàng được giới thiệu.
  • Ứng dụng có thể chuyển đổi chiến lược tại thời điểm chạy.
  • Chiến lược cho phép khách hàng chọn thuật toán cần thiết mà không cần sử dụng câu lệnh “switch” hoặc một loạt câu lệnh “if-else”.
  • Cấu trúc dữ liệu được sử dụng để thực hiện thuật toán hoàn toàn được gói gọn trong các lớp Chiến lược(strategy). Do đó, việc thực hiện một thuật toán có thể được thay đổi mà không ảnh hưởng đến lớp Context.

Nhược điểm:

  • Ứng dụng phải nhận thức được tất cả các chiến lược để chọn đúng chiến lược(strategy) cho tình huống phù hợp.
  • Context và các lớp Strategy thường giao tiếp thông qua giao diện được chỉ định bởi lớp cơ sở Strategy trừu tượng. Lớp cơ sở chiến lược phải hiển thị giao diện cho tất cả các hành vi được yêu cầu, mà một số lớp Chiến lược cụ thể có thể không triển khai.
  • Trong hầu hết các trường hợp, ứng dụng định cấu hình Context với đối tượng Strategy được yêu cầu. Do đó, ứng dụng cần tạo và duy trì hai đối tượng thay cho một.

2. Singleton Design Pattern

design-pattern-thuong-dung-singleton
Singleton Design Pattern

Singleton là một Design Pattern thuộc nhóm Creational Design Pattern. Hiểu đơn giản rằng Singleton Design Pattern đảm bảo mỗi class sẽ chỉ có duy nhất 1 instance, đồng thời cung cấp một điểm truy cập toàn cục cho instance này.

Singleton Pattern được áp dụng khi:

  • Đảm bảo rằng 1 class chỉ có 1 instance duy nhất và class này luôn sẵn sàng để sử dụng ở bất kỳ thời điểm hoặc vị trí nào trong phần mềm ứng dụng của chúng ta.
  • Việc quản lý việc truy cập tốt hơn vì chỉ có một thể hiện duy nhất.
  • Có thể quản lý số lượng thể hiện của một lớp trong giớn hạn chỉ định.

Ưu điểm:

  • Ai cũng có thể truy cập vào instance của singleton class, thực hiện gọi nó ở bất cứ đâu.
  • Dữ liệu ứng dụng không thay đổi bởi chỉ có một instance duy nhất.
  • Singleton class có hỗ trợ interface trong khi static class thì lại không. Đây là sự khác biệt giúp chúng ta nhận biết cần phải xác định để tạo static class hay singleton class.
  • Hỗ trợ kế thừa, static class thì không hỗ trợ kế thừa.

Nhược điểm:

  • Vi phạm nguyên tắc Single Responsibility Principle – nguyên tắc đơn nhiệm, một pattern giải quyết cùng lúc 2 vấn đề.
  • Singleton Design Pattern có thể ẩn đi những thiết kế xấu cho instance khi các component trong chương trình biết rõ về nhau.
  • Singleton yêu cầu xử lý đặc biệt trong một trường đa luồng, để nhiều luồng không tạo ra một đối tượng Singleton nhiều lần.
  • Tạo ra quá nhiều phụ thuộc, không thể sử dụng đa hình và dễ tạo ra các bug khiến các lập trình viên phải debug “thâu đêm”.

3. Observer Design Pattern

design-pattern-thuong-dung-observer
Observer Pattern

Observer pattern là một mẫu thiết kế phần mềm thuộc nhóm Behavior Pattern. Nó định nghĩa mối quan hệ phụ thuộc một – nhiều giữa các đối tượng để khi mà một đối tượng có sự thay đổi trạng thái, tất các thành phần phụ thuộc của nó sẽ được thông báo và cập nhật một cách tự động.

Observer Pattern được áp dụng khi:

  • Sự thay đổi trạng thái ở 1 đối tượng có thể được thông báo đến các đối tượng khác mà không phải giữ chúng liên kết quá chặt chẽ
  • Cần mở rộng dự án với ít sự thay đổi nhất.

Ưu điểm:

  • Cho phép thay đổi Subject và Observer một cách độc lập. Nhờ đó, chúng ta có thể tái sử dụng các Subject mà không cần tái sử dụng các Observer và ngược lại. 
  • Cho phép thêm Observer mà không sửa đổi Subject hoặc Observer khác. Vì vậy, nó đảm bảo nguyên tắc Open/Closed Principle (OCP).
  • Sự thay đổi trạng thái ở 1 đối tượng có thể được thông báo đến các đối tượng khác mà không phải giữ chúng liên kết quá chặt chẽ.
  • Một đối tượng có thể thông báo đến một số lượng không giới hạn các đối tượng khác.

Nhược điểm:

  • Rò rỉ bộ nhớ gây ra bởi sự cố vì đăng ký lắng nghe thì nhiều và rõ ràng nhưng việc hủy người đăng ký thì không có, dẫn tới nhiều chỗ không còn dùng tới việc đăng ký mà vẫn đang kết nối với Chủ đề.
  • Không kiểm soát được thứ tự subscriber nhận thông báo.

Một số Design Pattern thường dùng khác.

Tạm kết

Mặc dù design pattern thường dùng để mang lại những lợi ích cho người thiết kế phần mềm nhưng nếu sử dụng quá mức, nó sẽ có những “tác dụng phụ” không tốt.

Do đó, các lập trình viên nên cân nhắc việc sử dụng design pattern  thực sự mang lại hiệu quả cho dự án của mình không? Đồng thời, tìm thêm giải pháp khác thay thế và so sánh lợi ích của nó với design pattern xem đâu mới là lựa chọn phù hợp nhất.

Vì vậy, các kỹ sư phần mềm nên biết về diều dạng của design pattern và những dạng phổ biến nhất để sử dụng vào từng trường hợp khác nhau

Như vậy, bài viết đã chia sẻ cho bạn những lợi ích khi sử dụng design pattern cũng như các design pattern phổ biến để có thể ứng dụng giải quyết nhiều vấn đề khác nhau. Hy vọng với những thông tin ở trên, bạn có thể hiểu hơn và sử dụng design pattern cách hiệu quả nhất nhé!