Published at May 13th, 8:04 a.m. 110 0 0 8
  • 110 0

Design Pattern là gì?

Design pattern (mẫu thiết kế) là các giải pháp điển hình cho những vấn đề thường gặp trong thiết kế phần mềm. Chúng giống như những bản thiết kế có sẵn mà bạn có thể tùy chỉnh để giải quyết vấn đề lặp đi lặp lại trong code.

Khác với việc sao chép đoạn mã hay sử dụng thư viện có sẵn, design pattern không phải là đoạn mã cụ thể, mà là ý tưởng tổng quát giúp bạn xây dựng giải pháp phù hợp với chương trình của mình.

Design Pattern khác gì với thuật toán?

Nhiều người hay nhầm lẫn giữa pattern và thuật toán. Sự khác biệt chính là:

  • Thuật toán giống như công thức nấu ăn – có các bước rõ ràng để đạt mục tiêu cụ thể.
  • Design pattern giống như bản vẽ thiết kế – bạn biết hình dạng và công dụng của sản phẩm, nhưng cách xây dựng chi tiết thì bạn quyết định.

Lịch sử của Design Pattern

Câu hỏi "Ai phát minh ra design pattern?" tuy hay nhưng chưa chính xác lắm. Thực tế, design pattern không phải là khái niệm cao siêu, mà chỉ là giải pháp lặp lại cho các vấn đề quen thuộc trong lập trình hướng đối tượng. Khi một giải pháp được sử dụng đi sử dụng lại trong nhiều dự án, sẽ có ai đó đặt tên và mô tả chi tiết cho nó – đó chính là cách một pattern ra đời.

Nguồn gốc ý tưởng: Khái niệm "pattern" ban đầu không xuất phát từ ngành phần mềm, mà từ kiến trúc. Christopher Alexander là người đầu tiên mô tả ý tưởng này trong cuốn sách A Pattern Language: Towns, Buildings, Construction. Ông dùng "pattern" để nói đến những giải pháp thiết kế đô thị như chiều cao cửa sổ, số tầng của tòa nhà, hay diện tích không gian xanh,...

Ứng dụng vào lập trình: Bốn tác giả – Erich Gamma, John Vlissides, Ralph Johnson, và Richard Helm – đã áp dụng ý tưởng này vào lập trình và xuất bản sách Design Patterns: Elements of Reusable Object-Oriented Software vào năm 1994. Cuốn sách giới thiệu 23 mẫu thiết kế (design patterns) dành cho lập trình hướng đối tượng và nhanh chóng trở thành sách bán chạy.

Vì tên sách quá dài, người ta gọi tắt là “sách của bộ tứ” (Gang of Four)", hay viết ngắn là GoF book.

Từ sau cuốn sách GoF, nhiều mẫu thiết kế khác cũng được phát hiện. Phương pháp dùng pattern trở nên phổ biến, không chỉ trong hướng đối tượng mà còn lan sang nhiều lĩnh vực lập trình khác.

Tại sao nên học Design Pattern?

Thực tế, bạn hoàn toàn có thể làm lập trình viên nhiều năm mà không cần biết đến bất kỳ design pattern nào – và nhiều người vẫn đang làm vậy. Nhưng điều thú vị là: bạn có thể đang dùng pattern mà không hề nhận ra.

Vậy tại sao vẫn nên học?

1. Design Pattern là "hộp công cụ" giải pháp

Design pattern là tập hợp những giải pháp đã được kiểm chứng, chuyên dùng để xử lý các vấn đề quen thuộc trong thiết kế phần mềm. Dù bạn không gặp đúng những vấn đề đó, việc học pattern sẽ giúp bạn hiểu sâu hơn về tư duy thiết kế hướng đối tượng, từ đó áp dụng hiệu quả vào nhiều tình huống khác.

2. Giao tiếp dễ dàng hơn với đồng đội

Design pattern tạo ra một ngôn ngữ chung trong nhóm phát triển. Thay vì giải thích dài dòng, bạn chỉ cần nói:

"Cái này dùng Singleton là ổn rồi!" và mọi người sẽ hiểu ngay bạn muốn gì – nếu ai cũng biết pattern đó.

Hiểu pattern là tốt, nhưng quan trọng hơn là biết khi nào nên dùng và dùng sao cho hợp lý.

Phân loại Design Pattern

Design pattern có thể khác nhau về:

  • Độ phức tạp
  • Mức độ chi tiết
  • Quy mô áp dụng (áp dụng cho một phần nhỏ hay toàn bộ hệ thống)

Một cách ví dụ dễ hiểu:

Làm cho giao lộ an toàn hơn có thể chỉ cần lắp đèn giao thông (đơn giản), hoặc xây cả một nút giao nhiều tầng với hầm đi bộ (phức tạp hơn).

1. Idioms – Mẫu thiết kế đơn giản, mức thấp

  • Là những pattern cơ bản, thường gắn chặt với một ngôn ngữ lập trình cụ thể.
  • Áp dụng ở mức rất nhỏ, ví dụ như cú pháp hay mẹo nhỏ trong code.

2. Architectural Patterns – Mẫu kiến trúc, mức cao

  • Là những pattern tổng quát, có thể áp dụng trên toàn bộ hệ thống phần mềm.
  • Hầu như có thể dùng được trong mọi ngôn ngữ lập trình.
  • Dùng để thiết kế kiến trúc tổng thể cho ứng dụng (như MVC, Layered Architecture, Microservices,...).

3. Phân loại theo mục đích sử dụng

Tất cả các pattern còn lại thường được chia làm 3 nhóm chính, dựa theo mục đích:

a. Creational Patterns (Tạo đối tượng)

Cung cấp cách tạo object linh hoạt và tái sử dụng được.

Ví dụ: Singleton, Factory Method, Builder,…

b. Structural Patterns (Cấu trúc)

Hướng dẫn cách kết hợp các class và object thành cấu trúc lớn hơn, nhưng vẫn linh hoạt và dễ bảo trì.

Ví dụ: Adapter, Composite, Decorator,…

c. Behavioral Patterns (Hành vi)

Tập trung vào giao tiếp và phân chia trách nhiệm giữa các object.

Ví dụ: Observer, Strategy, Command,…

Mình sẽ tìm hiểu những pattern nổi tiếng từ nhiều tới ít nhé

Sắp xếp từ độ phức tạp thấp đến cao

3 sao: Complexity | Popularity

  1. Creational: Factory Method 1 3, Abstract Factory 2 3, Builder 2 3
  2. Structural: Adapter 1 3
  3. Behavioral: Command 1 3, Strategy 1 3, Iterator 2 3, Observer 2 3
Share
Viblo
Let's register a Viblo Account to get more interesting posts.