Trong quá trình học tập và thực hành lập trình, chắc chắn không ít lần bạn gặp phải những vấn đề lặp đi lặp lại . Trong những tình huống như vậy, bạn không nên giải quyết riêng từng vấn đề, mà nên tìm những giải pháp chung cho các vấn đề tương tự nhau. Những giải pháp chung như thế sẽ tăng tính tái sử dụng code, tính ổn định và khả năng bảo trì, bảo dưỡng cho toàn bộ dự án. Có một câu nói rất nổi tiêng trong giới lập trình mà ai ai cũng nắm rõ:

“Không bao giờ được lặp lại chính mình”

Nếu bạn đã áp dụng những giải pháp chung cho riêng mình, nhưng vẫn chưa hài lòng với hiệu quả của những giải pháp đó, việc bạn cần làm tiếp theo là tìm hiểu về các Design Pattern cho ngôn ngữ mà mình đang sử dụng. Về cơ bản, Design Pattern là những giải pháp tối ưu nhất được cộng đồng lập trình tổng hợp lại, nhằm giải quyết các vấn đề thường xuyên gặp phải trong lúc lập trình. Nếu có thể áp dụng thành thạo các Design Pattern trong code của mình, tốc độ làm việc của bạn sẽ được cải thiện rất nhiều. Bên cạnh đó, độ ổn định của dự án, khả năng bảo trì, bảo dưỡng trong tương lai cũng được cải thiện đáng kể.

Một tác dụng khác của Design Pattern là giúp code của bạn dễ đọc và dễ theo dõi hơn rất nhiều. Hầu hết các Desig Pattern đều có tên gọi và cấu trúc được xác định rõ. Việc này cũng sẽ giúp các lập trình viên trao đổi với nhau dễ dàng hơn. Nếu cả hai đã nắm được cấu trúc của một pattern, thì việc đọc và hiểu code sẽ không gặp nhiều khó khăn và người làm cũng không cần phải giải thích quá nhiều. Việc trao đổi và hiểu code của nhau sẽ giúp việc phối hợp làm việc hiệu quả.

Các loại Design Pattern 

Trong lập trình có rất nhiều vấn đề thuộc nhiều lĩnh vực khác nhau, vì vậy. Design Pattern cũng có rất nhiều. Nhưng nhìn chung, các Design Pattern thường được chia thành 3 nhóm chính:

1. Creational Design Pattern 

Các pattern thuộc nhóm này hầu hết đều được dùng để giải quyết các vấn đề liên quan đến tạo Class (class-creational pattern) và tạo các đối tượng (object-creational pattern). Các class-creational pattern sẽ tối ưu việc thừa hưởng (inheritance) các tính năng chung, và object-creational pattern tối ưu việc kết hợp và ủy nhiêm tính năng của nhiều object khác nhau. Các pattern nổi bật thuộc nhóm Creational Pattern bao gồm:

  • Abstract Factory: tạo các đối tượng thuộc các class liên quan đến nhau 
  • Builder: sử dụng một quy trình chung để tạo ra các object phức tạp khác nhau 
  • Factory Method: tạo ra các đối tượng thuộc các class khác nhau tuỳ theo nhu cầu sử dụng 
  • Prototype: sao chép một đối tượng nào đó mà không cần sử dụng class 
  • Singleton: các class chỉ tạo ra một object duy nhất, và object này có thể được truy cập xuyê suốt trong toàn bộ chương trinh

2. Structural Design Pattern 

Các pattern thuộc nhóm này thường được sử dụng kết hợp các class và object khác nhau để tạo ra các cấu trúc lớn và phức tạp hơn, nhưng vẫn đảm bảo được tính hiệu quả và linh hoạt của các class/object đó. Các pattern nổi bật thuộc nhóm này bao gồm:

  • Adapter: pattern cho phép kết hợp các object vốn không tương thích với nhau, phối hợp để xử lý các vấn đề chung 
  • Bridge: phân tách các class phức tạp hoặc các class liên quan mật thiết với nhau thành hai cấp chính – abstraction (trừu tượng) và implementation (thực thi), hai cấp này có thể được phát triển mở rộng độc lập với nhau
  • Composite: kết hợp các object theo cấu trúc cây và làm việc với cấu trúc này như một object riêng
  • Decorator: thêm các tính năng cần thiết và một object nào đó, bằng cách gói object này  trong một object khác đã có tính năng cần dùng 
  • Facade: cung cấp lớp kết nối (interface) đơn giản để sử dụng một thư viện, framework hoặc một tập hợp các class khác nhau
  • Flyweight: Tối ưu bộ nhớ khi sử dụng object bằng cách lưu trữ và chia sẻ các thông tin chung giữa các objects thay vì trữ dữ liệu trong từng object riêng biệt
  • Proxy: cung cấp sự thay thế cho một object khác. Proxy pattern sẽ kiểm soát các tác vụ truy cập vào object gốc, giúp ta có thể thực hiện một tác vụ trước hoặc sau khi truy cập vào object gốc.

3. Behavioral Design Pattern 

Các pattern thuộc nhóm Behavioral Design Pattern cung cấp các giải pháp để các objects có thể liên kết và trao đổi với nhau trong chương trình. Các pattern nổi bật thuộc nhóm này bao gồm:

  • Chain of Responsibility: phương thức truyền một tác vụ giữa một chuỗi các object 
  • Command: chuyển đổi một tác vụ thành một object chứa các thông tin liên quan đến tác vụ đó. Object chữa thông tin này có thể được sử dụng như paramater cho một function, đẩy vào hàng đợi hoặc hỗ trợ tính năng hoàn tác (undo)
  • Iterator: truy vết các phần tử trong các câu trúc Collection mà không quan tâm đến loại cấu trúc đó (Stack, Tree, Graph,…)
  • Mediator: dùng để điều phối truy cập và giao tiếp giữa các object với nhau. Các object sẽ không giao tiếp trực tiếp với nhau mà thông qua một Mediator object để làm giảm sự hỗn loạn giữa các object này
  • Memento: Lưu trữ và Khôi phục các trang thái trước của một object 
  • Observer: dùng để thông báo cho các object khác nhau về các sự kiện xảy ra mà các object này đang quan sát 
  • State: cho phép các object thay đổi cách các tính năng riêng của nó khi dữ liệu trạng thái bên trong thay đổi
  • Strategy: tổng hợp các nhóm thuật toán liên quan đến nhau, tạo cho mỗi nhóm một class riêng và các object thuộc những class này có thể thay thế cho nhau trong quá trình sử dụng
  • Template Method: tạo ra một bộ khung cho một thuật toán nhất định trong một class, nhưng cho phép các class nhỏ hơn thay đổi các bước của thuật toán mà không làm ảnh hưởng đến cấu trúc class
  • Visitor: thực hiện một tác vụ nào đó trên một đối tượng đã được tạo ra trước đó, mà không làm thay đổi cấu trúc của đối tượng

Tạm kết

Trong bài viết này, WorkLabs CodingSchool đã giới thiệu đến bạn một số Design Pattern quan trọng, có thể sử dụng cho hầu hết các ngôn ngữ lập trình phổ biến hiện nay. Việc hiểu và sử dụng thành thục các pattern trên chắc chắn sẽ cần rất nhiều thời gian và công sức. Chính vì thế, bạn cứ thong thả và áp dụng từng cái một nhé.

Ở những bài viết tiếp theo, WorkLabs CodingSchool sẽ giới thiệu chi tiết hơn về cách sử dụng của từng pattern trên. Đừng quên theo dõi tại fanpage WorkLabs và WorkLabs CodingSchool blog nha. Hẹn gặp lại!