Chắp cánh ước mơ

Nếu có 100 cuộc phỏng vấn senior Java nói riêng hay các ngôn ngữ khác nói chung thì cũng phải đến 90 cuộc phỏng vấn là hỏi về Design pattern, cơ hội đàm phán lương đây rồi, 🙂 . Vậy design pattern là gì? có gì hấp dẫn ở đây?

Định nghĩa

Design pattern là các mẫu lập trình phổ biến được xây dựng bởi các lập trình viên nhiều kinh nghiệm, nó giúp source code của chúng ta dễ đọc, dễ hiểu và dễ mở rộng về sau này. Có thể nói design pattern định nghĩa ra các tiêu chuẩn code và các mẫu lập trình mà từ đó chúng ta mới có hàng trăm nghìn thư viện lập trình như ngày hôm nay

Một số design pattern

Design pattern quan trọng như vậy, hay ho như vậy nhưng với đại bộ phận lập trình viên chúng ta nó lại không được quá chú trọng, vì chúng ta đã quá quen và phụ thuộc vào việc sử dụng các thư viện lập trình sẵn có như Spring hay JavaEE, chúng ta chỉ cần tuân theo các mẫu sẵn có của họ là được

Đối với cá nhân mình, đi vào con đường phát triển thư viện, framework thì design pattern là thứ sống còn, không thể không thành thạo. Còn đối với chúng ta nói chung, mình nghĩ việc nắm bắt được các design pattern là điều nên làm, nó sẽ giúp chúng ta tiếp cận các thư viện lập trình nhanh chóng, giống kiểu, chưa cần đọc đã hiểu phải làm thế nào rồi, 🙂

Theo ý kiến cá nhân mình, hiện có khoảng 24 design patterns phổ biến và chia thành 3 nhóm như sau:

Nhóm 1. Creational Patterns

Nhóm này được dùng để phục vụ cho việc khởi tạo đối tượng và nó bao gồm:

  1. Singleton: Tạo ra đối tượng sử dụng cho toàn chương trình và chỉ khởi tạo 1 lần
  2. Factory: Tạo ra các đối tượng theo một quy tắc nhất định
  3. Factory Method: Tạo ra các đối tượng theo một quy tắc nhất định, nhưng cho phép lớp thừa kế quy định đối tượng sẽ được tạo ra
  4. Abstract Factory: Tạo ra các đối tượng theo một quy tắc nhất định mà không cần biết kiểu của đối tượng
  5. Builder: Thường dùng để tạo các đối tượng readonly hay immutable
  6. Prototype: Thường dùng để clone 1 đối tượng từ 1 đối tượng có sẵn
  7. Object Pool: Dùng để tạo ra các đối tượng có thể dùng lại nhiều lần để tránh khởi tạo không cần thiết
Nhóm 2. Behavioral Patterns

Nhóm này phục vụ cho việc xử lý các hành động (action, request, event), nó bao gồm:

  1. Chain of Responsibility: Là một chuỗi xử lý cho một hành động
  2. Command: Xử lý hành động theo kiểu tương ứng
  3. Interpreter: Chuyên từ đối tượng này sang đối tượng khác
  4. Iterator: Dùng để duyệt qua một collection như bạn vẫn hay dùng vòng for với List và Set
  5. Mediator: Định nghĩ ra một đối tượng sử dụng chung cho các lớp, ví dụ đối tượng Graphic sẽ được sử dụng bởi các lớp Button, TextView, ...
  6. Memento: Dùng để quản lý trạng thái và trở lại trạng thái trước khi cần thiết, giống như undo và redo
  7. Observer: Lắng nghe một sự kiện sẽ xảy đến và xử lý sự kiện đó
  8. Strategy: Đưa ra các xử lý tương ứng với hành động xảy đến
  9. Template Method: Quy định trình tự gọi hàm để đảm bảo lập trình viên không bị mắc sai lầm, nếu bạn dùng Android bạn sẽ thấy các hàm onCreate, onStart, ... đây là 1 trong những design pattern quan trọng nhất của Android
  10. Visitor: "Thăm quan" các đối tượng trong một mảng hay 1 collection
  11. Null Object: Có thể hiểu đơn giản là if (value == null) do something else do something
Nhóm 3. Structural Patterns

Nhóm này phục vụ cho việc kết nối các đối tượng và mở rộng hệ thống, nó bao gồm:

  1. Adapter: Chuyển một interface của một class sang 1 interface của 1 class khác, cảm giác nó cũng hơi giống giống Command pattern, 😃
  2. Bridge: Giữ lại các phần giống nhau, và tách các phần khác nhau ra thành các lớp riêng biệt
  3. Composite: Kết hợp các lớp lại với nhau để tránh phải extends hay implements quá nhiều lớp và interface, ví dụ chúng ta hay có lớp service sử dụng rất nhiều lớp repo và các service khác
  4. Decorator: Là lớp để "trang hoàng" thêm cho đối tượng của chúng ta trước khi đưa đối tượng này vào sử dụng hoặc lưu trữ, phản hồi
  5. Flyweight: Dùng để chia sẻ một lượng lớn các đối tượng được khởi tạo một lần
  6. Proxy: Dùng để wrap lại đối tượng thực tế, thông thường chúng ta sử dụng wrap lại các đối tượng của thư viện bằng đối tượng của chúng ta, để dễ dàng thay đổi thư viện sau này

Kết luận

Với ba nhóm cơ bản và 24 các mẫu lập trình cơ bản sẽ giúp chúng ta tạo ra những mã nguồn dễ đọc, dễ hiểu và dễ bảo trỉ hơn trong tương lai. Mặc dù khó để học và để áp dụng vào trong dự án thực tế nhưng chúng ta hãy kiên trì nhé, nó xứng đáng để bỏ thời gian và công sức để học tập và theo đuổi