Design Patterns: Danh mục các mẫu thiết kế

Design Pattern là gì?

Mẫu thiết kế (Design Pattern) là giải pháp điển hình cho các vấn đề thường xảy ra trong thiết kế phần mềm. Chúng giống như các bản thiết kế được tạo sẵn mà bạn có thể tùy chỉnh để giải quyết vấn đề thiết kế lặp lại trong mã của mình.

Bạn không thể chỉ tìm một mẫu và sao chép nó vào chương trình của mình, theo cách bạn có thể làm với các chức năng hoặc thư viện có sẵn. Mẫu thiết kế không phải là một đoạn mã cụ thể, mà là một khái niệm chung để giải quyết một vấn đề cụ thể. Bạn có thể làm theo các mẫu thiết kế và triển khai một giải pháp phù hợp với thực tế của chương trình của riêng bạn.

Các mẫu thiết kế thường bị nhầm lẫn với các thuật toán, vì cả hai khái niệm đều mô tả các giải pháp điển hình cho một số vấn đề đã biết. Trong khi một thuật toán luôn xác định một tập hợp các hành động rõ ràng có thể đạt được một số mục tiêu, thì một mẫu thiết kế là một mô tả cấp cao hơn về một giải pháp. Mã của cùng một mẫu thiết kế được áp dụng cho hai chương trình khác nhau có thể khác nhau.

Tương tự với thuật toán là công thức nấu ăn: cả hai đều có các bước rõ ràng để đạt được mục tiêu. Mặt khác, một mẫu thiết kế giống như một bản thiết kế: bạn có thể xem kết quả và các tính năng của nó, nhưng thứ tự thực hiện chính xác là tùy thuộc vào bạn.

Lịch sử của Design Pattern

Ai là người phát minh ra các mẫu thiết kế? Đó là một câu hỏi hay, nhưng không chính xác lắm. Các mẫu thiết kế không phải là những khái niệm phức tạp, khó hiểu — hoàn toàn ngược lại. Các mẫu thiết kế là giải pháp điển hình cho các vấn đề thường gặp trong thiết kế hướng đối tượng. Khi một giải pháp được lặp đi lặp lại trong các dự án khác nhau, cuối cùng ai đó sẽ đặt tên cho nó và mô tả chi tiết giải pháp. Về cơ bản, đó là cách một mẫu được phát hiện.

Khái niệm Design Pattern lần đầu tiên được Christopher Alexander mô tả trong cuốn sách A Pattern Language: Towns, Buildings, Construction. Cuốn sách mô tả một “ngôn ngữ” để thiết kế môi trường đô thị. Các đơn vị của ngôn ngữ này là các mẫu thiết kế. Họ có thể mô tả các cửa sổ nên cao như thế nào, một tòa nhà nên có bao nhiêu tầng, diện tích cây xanh lớn như thế nào trong khu vực lân cận, v.v.

Ý tưởng được chọn bởi bốn tác giả: Erich Gamma, John Vlissides, Ralph Johnson và Richard Helm. Năm 1994, họ xuất bản cuốn sách Design Patterns: Elements of Reusable Object-Oriented Software, trong đó họ áp dụng khái niệm mẫu thiết kế vào lập trình. Cuốn sách giới thiệu 23 mẫu giải quyết các vấn đề khác nhau của thiết kế hướng đối tượng và nhanh chóng trở thành sách bán chạy nhất. Do cái tên dài dòng của nó, mọi người bắt đầu gọi nó là “cuốn sách của nhóm bốn người” và nhanh chóng được rút ngắn thành “cuốn sách của GoF”.

Kể từ đó, hàng chục mẫu thiết kế hướng đối tượng khác đã được phát hiện. “Phương pháp tiếp cận mẫu thiết kế” đã trở nên rất phổ biến trong các lĩnh vực lập trình khác, vì vậy rất nhiều mẫu thiết kế khác hiện cũng tồn tại ngoài thiết kế hướng đối tượng.

Vì sao nên học Design Pattern?

Sự thật là bạn có thể xoay sở để làm việc như một lập trình viên trong nhiều năm mà không cần biết về một mẫu thiết kế nào. Rất nhiều người làm điều đó. Mặc dù vậy, ngay cả trong trường hợp đó, bạn có thể đang triển khai một số mẫu thiết kế mà không hề biết. Vậy tại sao bạn lại dành thời gian học chúng?

  • Các mẫu thiết kế là một bộ công cụ gồm các giải pháp đã được thử và kiểm tra cho các vấn đề thường gặp trong thiết kế phần mềm. Ngay cả khi bạn không bao giờ gặp phải những vấn đề này, việc biết các mẫu thiết kế vẫn hữu ích vì nó dạy bạn cách giải quyết tất cả các loại vấn đề bằng cách sử dụng các nguyên tắc của thiết kế hướng đối tượng.
  • Các mẫu thiết kế định nghĩa một ngôn ngữ chung mà bạn và đồng đội của bạn có thể sử dụng để giao tiếp hiệu quả hơn. Bạn có thể nói, “Ồ, chỉ cần sử dụng Singleton cho điều đó,” và mọi người sẽ hiểu ý tưởng đằng sau đề xuất của bạn. Không cần giải thích Singleton là gì nếu bạn biết mẫu thiết kế và tên của nó.

Phân loại các mẫu

Các mẫu thiết kế khác nhau bởi độ phức tạp, mức độ chi tiết và quy mô khả năng áp dụng cho toàn bộ hệ thống đang được thiết kế. Tôi thích sự tương tự với việc xây dựng đường: bạn có thể làm cho một giao lộ an toàn hơn bằng cách lắp đặt một số đèn giao thông hoặc xây dựng toàn bộ nút giao thông nhiều tầng với lối đi ngầm dành cho người đi bộ.

Các mẫu thiết kế cơ bản và cấp thấp nhất thường được gọi là idioms. Chúng thường chỉ áp dụng cho một ngôn ngữ lập trình duy nhất.

Các mẫu thiết kế phổ biến và cao cấp nhất là architectural patterns. Các nhà phát triển có thể triển khai các mẫu thiết kế này bằng hầu hết mọi ngôn ngữ. Không giống như các mẫu thiết kế khác, chúng có thể được sử dụng để thiết kế kiến ​​trúc của toàn bộ ứng dụng.

Ngoài ra, tất cả các mẫu có thể được phân loại theo ý định hoặc mục đích của chúng. Cuốn sách này bao gồm ba nhóm mẫu thiết kế chính:

  • Mẫu khởi tạo (Creational Pattern) cung cấp các cơ chế khởi tạo đối tượng để tăng tính linh hoạt và tái sử dụng mã hiện có.
  • Mẫu cấu trúc (Structural Pattern) giải thích cách tập hợp các đối tượng và lớp thành các cấu trúc lớn hơn, trong khi vẫn giữ cho cấu trúc linh hoạt và hiệu quả.
  • Mẫu hành vi (Behavioral Pattern) quan tâm đến việc giao tiếp hiệu quả và phân công trách nhiệm giữa các đối tượng.

Mẫu khởi tạo

Mẫu khởi tạo (Creational Pattern) cung cấp các cơ chế khởi tạo đối tượng để tăng tính linh hoạt và tái sử dụng mã hiện có.

Mẫu cấu trúc

Mẫu cấu trúc (Structural Pattern) giải thích cách tập hợp các đối tượng và lớp thành các cấu trúc lớn hơn trong khi vẫn giữ các cấu trúc này linh hoạt và hiệu quả.

Mẫu hành vi

Mẫu thiết kế hành vi (Behavioral Patterns) liên quan đến các thuật toán và sự phân công trách nhiệm giữa các đối tượng.

Design Pattern
Bài Viết Liên Quan:
Design Patterns: Visitor
Trung Nguyen 15/01/2021
Design Patterns: Visitor

Visitor là một mẫu thiết kế hành vi cho phép bạn tách các thuật toán khỏi các đối tượng mà chúng hoạt động.

Design Patterns: Template Method
Trung Nguyen 15/01/2021
Design Patterns: Template Method

Template Method định nghĩa khung của một thuật toán trong lớp cha cho phép lớp con ghi đè các bước cụ thể của thuật toán mà không thay đổi cấu trúc của nó.

Design Patterns: Strategy
Trung Nguyen 15/01/2021
Design Patterns: Strategy

Strategy cho phép bạn định nghĩa một nhóm thuật toán, đặt mỗi thuật toán vào một lớp riêng biệt và làm cho các đối tượng của chúng có thể hoán đổi cho nhau.

Design Patterns: State
Trung Nguyen 15/01/2021
Design Patterns: State

State là một mẫu thiết kế hành vi cho phép một đối tượng thay đổi hành vi của nó khi trạng thái bên trong của nó thay đổi.