[Tut 1 - Design Pattern] Giới Thiệu Về Design Pattern

Design Pattern là một kỹ thuật trong lập trình hướng đối tượng, nó khá quan trọng và mọi lập trình viên muốn giỏi đều phải biết. Được sử dụng thường xuyên trong các ngôn ngữ OOP. Nó sẽ cung cấp cho bạn các “mẫu thiết kế”, giải pháp để giải quyết các vấn đề chung, thường gặp trong lập trình. Các vấn đề mà bạn gặp phải có thể bạn sẽ tự nghĩ ra cách giải quyết nhưng có thể nó chưa phải là tối ưu. Design Pattern giúp bạn giải quyết vấn đề một cách tối ưu nhất, cung cấp cho bạn các giải pháp trong lập trình OOP.

Tổng quan Design Pattern

Design Pattern có 23 mẫu cơ bản (GoF) và hình dưới là mối quang hệ giữa chúng


23 mẫu cơ bản (GoF) và mối quang hệ giữa chúng

Trong Design Pattern có 3 nhóm bao gồm:
  • Creational Pattern (nhóm khởi tạo) gồm: Abstract Factory, Factory Method, Singleton, Builder, Prototype. Nó sẽ giúp bạn trong việt khởi tạo đối tượng, như bạn biết để khởi tạo bạn phải sử dụng từ khóa new, nhóm Creational Pattern sẽ sử dụng một số thủ thuật để khởi tạo đối tượng mà bạn sẽ không nhìn thấy từ khóa này.
  • Structural Pattern (nhóm cấu trúc) gồm: Adapter, Bridge, Composite, Decorator, Facade, Proxy và Flyweight.. Nó dùng để thiết lập, định nghĩa quan hệ giữa các đối tượng.
  • Behavioral Pattern (nhóm hành vi) gồm: Interpreter, Template Method, Chain of Responsibility, Command, Iterator, Mediator, Memento, Observer, State, Strategy và Visitor. Nhóm này dùng trong thực hiện các hành vi của đối tượng.
Design Pattern giúp bạn tái sử dụng mã lệnh và dễ dàng mở rộng. Để chuẩn bị học Design Pattern bạn cần phải nắm chắc các khái niệm sau:
  • Bốn đặc tính của OOP: Thừa kế, Đa hình, Trừu tượng, Bao đóng.
  • Khái niệm interface và abstract. Cái này cực kỳ quan trọng, để hiểu và áp dụng 2 khái niệm này có thể sẽ mất một thời gian, nhưng khi bạn nắm chắc nó bạn sẽ thấy nó thực sự cần thiết.
  • Bỏ tư duy theo lối cấu trúc, nâng tư duy hoàn toàn OOP.

Tại sao sử dụng Design Pattern?

  • Design pattern cung cấp giải pháp ở dạng tổng quát, giúp tăng tốc độ phát triển phần mềm bằng cách đưa ra các mô hình test, mô hình phát triển đã qua kiểm nghiệm. Thiết kế phần mềm hiệu quả đòi hỏi phải cân nhắc các vấn đề sẽ nảy sinh trong quá trình hiện thực hóa (implementation). Dùng lại các design pattern giúp tránh được các vấn đề tiềm ẩn có thể gây ra những lỗi lớn, dễ dàng nâng cấp, bảo trì về sau.
  • Một lợi thế lớn để sử dụng một mẫu thiết kế là lập trình viên khác sẽ có thể dễ dàng nhận ra nó (đặc biệt là nếu bạn sử dụng quy ước đặt tên tốt).

Khi nào nên sử dụng Design pattern?

Đó là khi bạn muốn giữ cho chương trình của mình thực sự đơn giản. Việc sử dụng các design pattern sẽ giúp chúng ta giảm được thời gian và công sức suy nghĩ ra các cách giải quyết cho những vấn đề đã có lời giải. Bạn có thể đọc qua cuốn Head First Design Patterns để có cái nhìn tổng quát hơn về design pattern. Hệ thống các mẫu design pattern chuẩn hiện có 23 mẫu được định nghĩa trong cuốn Design patterns Elements of Reusable Object Oriented Software mà khởi đầu là cuốn Gang of Four (GoF). Các tác giả của cuốn sách là Erich Gamma, Richard Helm, Ralph Johnson và John Vlissides, hay còn được biết đến với các tên “Gang of Four” hay đơn giản là “GoF”. Hệ thống các mẫu này có thể nói là đủ và tối ưu cho việc giải quyết hết các vấn đề của bài toán phân tích thiết kế và xây dựng phần mềm trong thời điểm hiện tại. Hệ thống các mẫu design pattern được chia thành 3 nhóm: nhóm Creational (5 mẫu), nhóm Structural (7 mẫu) và nhóm Behavioral (11 mẫu).
  1. Nhóm Creational (Nhóm kiến tạo): Những mẫu thiết kế này cung cấp một cách để tạo ra các đối tượng bằng cách ẩn logic khởi tạo thay vì khởi tạo các đối tượng trực tiếp sử dụng từ khóa new. Điều này cho phép linh hoạt hơn cho chương trình trong việc quyết định đối tượng cần phải được tạo ra cho một trường hợp sử dụng nhất định.
    1. Abstract Factory: Cung cấp một interface cho việc tạo lập các đối tượng (có liên hệ với nhau) mà không cần qui định lớp khi hay xác định lớp cụ thể (concrete) tạo mỗi đối tượng. Tần suất sử dụng: cao.
    2. Builder: Tách rời việc xây dựng (construction) một đối tượng phức tạp khỏi biểu diễn của nó sao cho cùng một tiến trình xây dựng có thể tạo được các biểu diễn khác nhau.Tần suất sử dụng: trung bình thấp.
    3. Factory Method: Định nghĩa Interface để sinh ra đối tượng nhưng để cho lớp con quyết định lớp nào được dùng để sinh ra đối tượng Factory method cho phép một lớp chuyển quá trình khởi tạo đối tượng cho lớp con.Tần suất sử dụng: cao.
    4. Prototype: Qui định loại của các đối tượng cần tạo bằng cách dùng một đối tượng mẫu, tạo mới nhờ vào sao chép đối tượng mẫu này.Tần suất sử dụng: trung bình.
    5. Singleton: Đảm bảo 1 class chỉ có 1 instance và cung cấp 1 điểm truy xuất toàn cục đến nó.Tần suất sử dụng: cao trung bình.
  2. Nhóm Structural (nhóm cấu trúc): Các mẫu thiết kế này liên quan đến thành phần của lớp và đối tượng. Khái niệm về thừa kế được sử dụng tạo các interfaces và xác định cách tạo các đối tượng để có được các chức năng mới.
    1. Adapter: Do vấn đề tương thích, thay đổi interface của một lớp thành một interface khác phù hợp với yêu cầu người sử dụng lớp.Tần suất sử dụng: cao trung bình
    2. Bridge: Tách rời ngữ nghĩa của một vấn đề khỏi việc cài đặt ; mục đích để cả hai bộ phận (ngữ nghĩa và cài đặt) có thể thay đổi độc lập nhau.Tần suất sử dụng: trung bình
    3. Composite: Tổ chức các đối tượng theo cấu trúc phân cấp dạng cây; Tất cả các đối tượng trong cấu trúc được thao tác theo một cách thuần nhất như nhau.Tạo quan hệ thứ bậc bao gộp giữa các đối tượng. Client có thể xem đối tượng bao gộp và bị bao gộp như nhau -> khả năng tổng quát hoá trong code của client -> dễ phát triển, nâng cấp, bảo trì.Tần suất sử dụng: cao trung bình
    4. Decorator: Gán thêm trách nhiệm cho đối tượng (mở rộng chức năng) vào lúc chạy (dynamically).Tần suất sử dụng: trung bình
    5. Facade: Cung cấp một interface thuần nhất cho một tập hợp các interface trong một “hệ thống con” (subsystem). Nó định nghĩa 1 interface cao hơn các interface có sẵn để làm cho hệ thống con dễ sử dụng hơn.Tần suất sử dụng: cao
    6. Flyweight: Sử dụng việc chia sẻ để thao tác hiệu quả trên một số lượng lớn đối tượng “cở nhỏ” (chẳng hạn paragraph, dòng, cột, ký tự…).Tần suất sử dụng: thấp
    7. Proxy: Cung cấp đối tượng đại diện cho một đối tượng khác để hỗ trợ hoặc kiểm soát quá trình truy xuất đối tượng đó. Đối tượng thay thế gọi là proxy.Tần suất sử dụng: cao trung bình
  3. Nhóm Behavioral (nhóm hành vi): Những mẫu thiết kế đặc biệt quan tâm đến giao tiếp giữa các đối tượng.
    1. Chain of Responsibility: Khắc phục việc ghép cặp giữa bộ gởi và bộ nhận thông điệp; Các đối tượng nhận thông điệp được kết nối thành một chuỗi và thông điệp được chuyển dọc theo chuỗi nầy đến khi gặp được đối tượng xử lý nó.Tránh việc gắn kết cứng giữa phần tử gởi request với phần tử nhận và xử lý request bằng cách cho phép hơn 1 đối tượng có có cơ hội xử lý request . Liên kết các đối tượng nhận request thành 1 dây chuyền rồi “pass” request xuyên qua từng đối tượng xử lý đến khi gặp đối tượng xử lý cụ thể.Tần suất sử dụng: trung bình thấp
    2. __Command Mỗi yêu cầu (thực hiện một thao tác nào đó) được bao bọc thành một đối tượng. Các yêu cầu sẽ được lưu trữ và gởi đi như các đối tượng.Đóng gói request vào trong một Object , nhờ đó có thể nthông số hoá chương trình nhận request và thực hiện các thao tác trên request: sắp xếp, log, undo…Tần suất sử dụng: cao trung bình
    3. Interpreter: Hỗ trợ việc định nghĩa biểu diễn văn phạm và bộ thông dịch cho một ngôn ngữ.Tần suất sử dụng: thấp
    4. Iterator: Truy xuất các phần tử của đối tượng dạng tập hợp tuần tự (list, array, …) mà không phụ thuộc vào biểu diễn bên trong của các phần tử.Tần suất sử dụng: cao
    5. Mediator: Định nghĩa một đối tượng để bao bọc việc giao tiếp giữa một số đối tượng với nhau.Tần suất sử dụng: trung bình thấp
    6. Memento: Hiệu chỉnh và trả lại như cũ trạng thái bên trong của đối tượng mà vẫn không vi phạm việc bao bọc dữ liệu.Tần suất sử dụng: thấp
    7. Observer: Định nghĩa sự phụ thuộc một-nhiều giữa các đối tượng sao cho khi một đối tượng thay đổi trạng thái thì tất cả các đối tượng phụ thuộc nó cũng thay đổi theo.Tần suất sử dụng: cao
    8. State: Cho phép một đối tượng thay đổi hành vi khi trạng thái bên trong của nó thay đổi , ta có cảm giác như class của đối tượng bị thay đổi.Tần suất sử dụng: trung bình
    9. Strategy: Bao bọc một họ các thuật toán bằng các lớp đối tượng để thuật toán có thể thay đổi độc lập đối với chương trình sử dụng thuật toán.Cung cấp một họ giải thuật cho phép client chọn lựa linh động một giải thuật cụ thể khi sử dụng.Tần suất sử dụng: cao trung bình
    10. Template method: Định nghĩa phần khung của một thuật toán, tức là một thuật toán tổng quát gọi đến một số phương thức chưa được cài đặt trong lớp cơ sở; việc cài đặt các phương thức được ủy nhiệm cho các lớp kế thừa.Tần suất sử dụng: trung bình
    11. Visitor: Cho phép định nghĩa thêm phép toán mới tác động lên các phần tử của một cấu trúc đối tượng mà không cần thay đổi các lớp định nghĩa cấu trúc đó.Tần suất sử dụng: thấp

Bạn có thể học Design pattern ở đâu:

  • Cuốn sách nổi tiếng nhất và là khởi đầu của Design pattern là “Gang of Four (GoF)“
  • Cuốn Professional Java EE Design Pattern nói về Design pattern trong java, có cả source code minh họa trên trang wrox.com
  • Trang mạng uy tín để bạn có thể học thêm ngoài 23 mẫu cơ bản là Sourcemaking.com có code mẫu
  • Kênh youtube có “Derek Banas“ (kênh này mình rất thích này, tác giả nói giọng rất hay và biểu cảm :) ), và khá nhiều kênh khác.

Xem thêm các bài hướng dẫn về Design Pattern:

  1. [Tut 1 - Design Pattern] Giới thiệu về Design Pattern
  2. [Tut 2 - Design Pattern] Singleton
  3. [Tut 3 - Design Pattern] Adapter
  4. [Tut 4 - Design Pattern] Proxy
  5. [Tut 5 - Design Pattern] Observer
  6. [Tut 6 - Design Pattern] Factory
  7. [Tut 7 - Design Pattern] Composite
  8. [Tut 8 - Design Pattern] Wrapper
  9. [Tut 9 - Design Pattern] Prototype
  10. [Tut 10 - Design Pattern] Null Object
  11. [Tut 11 - Design Pattern] Object Pool
  12. [Tut 12 - Design Pattern] Builder Pattern
  13. [Tut 13 - Design Pattern] Bridge Pattern
  14. [Tut 14 - Design Pattern] Filter/Criteria Pattern
  15. [Tut 15 - Design Pattern] Decorator
  16. [Tut 16 - Design Pattern] Facade Pattern
  17. [Tut 17 - Design Pattern] Flyweight Pattern
  18. [Tut 18 - Design Pattern] Command Pattern
  19. [Tut 19 - Design Pattern] Interpreter Pattern
  20. [Tut 20 - Design Pattern] Iterator Pattern
  21. [Tut 21 - Design Pattern] Mediator Pattern
  22. [Tut 22 - Design Pattern] Memento Pattern
  23. [Tut 23 - Design Pattern] State Pattern
  24. [Tut 24 - Design Pattern] Strategy Pattern
  25. [Tut 25 - Design Pattern] Template Pattern
  26. [Tut 26 - Design Pattern] Visitor Pattern
  27. [Tut 27 - Design Pattern] MVC Pattern
  28. [Tut 28 - Design Pattern] Business Delegate Pattern
  29. [Tut 29 - Design Pattern] Composite Entity Pattern
  30. [Tut 30 - Design Pattern] Data Access Object Pattern
  31. [Tut 31 - Design Pattern] Front Controller Pattern
  32. [Tut 32 - Design Pattern] Intercepting Filter Pattern
  33. [Tut 33 - Design Pattern] Service Locator Pattern
  34. [Tut 34 - Design Pattern] Transfer Object Pattern

Nhận xét

Bài đăng phổ biến từ blog này

Base64 image – Lợi hay hại?

Hàm "tap" trong Laravel Collection