Lời nói đầu
Design Pattern là giải pháp điển hình cho các vấn đề thường gặp trong thiết kế phần mềm. Chúng giống như 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ế thường gặp 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 hàm hoặc thư viện có sẵn. Mẫu 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 chi tiết mẫu 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 loại Design Pattern trong Java
Creational Pattern - Nhóm khởi tạo (5 mẫu)
Các mẫu nằm trong Nhóm khởi tạo hoạt động dựa trên việc tạo ra các đối tượng. Chúng cung cấp một giải pháp để khởi tạo một đối tượng theo những cách tốt nhất có thể. Chúng ta sử dụng Creational Pattern thay cho việc khởi tạo trực tiếp với các hàm tạo. Các mẫu này làm cho quá trình khởi tạo thích ứng và năng động hơn. Đặc biệt, chúng có thể xử lý linh hoạt việc tạo đối tượng và cách tạo cũng như khởi tạo chúng.
- Singleton: Mẫu Singleton là một mẫu hạn chế số lượng đối tượng của một lớp.
- Abstract Factory: Mẫu này vô cùng hữu ích khi chúng ta có một lớp cha với nhiều lớp con và cần trả về một trong các lớp con dựa vào đầu vào. Mẫu này thích hợp sử dụng khi có sự tham gia của các bước tạo đối tượng phức tạp. Đảm bảo các bước này hoạt động một cách tập trung và không tiếp với các lớp soạn thảo.
- Factory method: Định nghĩa Interface để tạo ra đối tượng nhưng để 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
- Builder: Được sử dụng để giải quyết các vấn đề khi có nhiều thuộc tính trong một đối tượng. Builder giải quyết vấn đề của các tham số tùy chọn và trạng thái không nhất quán. Nó giải quyết vấn đề bằng cách cung cấp từng bước để xây dựng đối tượng và phương thức trả về đối tượng cuối cùng. Builder là cách thay thế để xây dựng các đối tượng phức tạp. Chúng ta nên sử dụng design pattern này khi muốn xây dựng các loại đối tượng bất biến khác nhau bằng cách sử dụng cùng một quy trình xây dựng đối tượng.
- Prototype: Sử dụng để sao chép đối tượng gốc sang đối tượng mới và sau đó thay đổi chúng theo yêu cầu mà chúng ta muốn. Mẫu này được sử dụng cơ chế sao chép Java để sao chép đối tượng
Structural Pattern (Nhóm cấu trúc)
Design pattern thuộc nhóm cấu trúc cung cấp các cách khác nhau để tạo cấu trúc lớp. Ví dụ, tạo một đối tượng từ những đối tượng nhỏ hơn bằng cách sử dụng kế thừa và thành phần. Các design pattern nhóm cấu trúc cho chúng ta thấy cách kết nối các phần khác nhau của hệ thống với nhau một cách linh hoạt và có thể mở rộng. Các mẫu này cũng đảm bảo rằng khi một trong các thành phần thay đổi, toàn bộ cấu trúc ứng dụng cũng không cần phải thay đổi.
- Adapter: Được sử dụng để đảm bảo hai giao diện không liên quan liên có thể hoạt động cùng nhau. Adapter chuyển đổi một giao diện của một lớp thành một giao diện khác phù hợp với yêu cầu người sử dụng lớp.
- 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ả đối tượng trong cấu trúc được thao tác theo cách thuần nhất như nhau. Composite cho phép khách hàng xử lý các đối tượng riêng lẻ và các thành phần của các đối tượng một cách thống nhất.
- Proxy: Cung cấp đối tượng thay thế hoặc giữ chỗ cho một đối tượng khác để cung cấp quyền truy cập kiểm soát nó. Đối tượng thay thế gọi là proxy.
- Flyweight: Design pattern này tạo ra nhiều đối tượng của một lớp. Mẫu Flyweight cho phép chúng ta chia sẻ các đối tượng có chi tiết nhỏ. Flyweight là một đối tượng dùng chung mà chúng ta có thể sử dụng đồng thời trong nhiều ngữ cảnh.
- Facade: giúp các ứng dụng khách dễ dàng tương tác với hệ thống. Design Pattern facade cung cấp một giao diện thống nhất cho một tập hợp các giao diện trong một hệ thống con. Giả sử có một ứng dụng với một tập hợp các giao diện để sử dụng cơ sở dữ liệu Oracle hoặc Mysql. Chúng ta cần tạo các loại báo cáo khác nhau, chẳng hạn như PDF, HTML. Chúng ta sẽ có một bộ giao diện khác nhau để làm việc với các loại cơ sở trên dữ liệu khác nhau.
- 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 động lập với nhau.
- 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.
Behavioral Design Pattern (Nhóm hành vi tương tác)
- Template method: phương thức này tạo một phương thức sơ khai và xác định một số bước thực hiện cho các lớp con. Mẫu xác định các bước để thực thi một thuật toán. Nó cũng cung cấp một triển khai mặc định chung cho tất cả hoặc một số lớp con
- Chain of Responsibility: Khắc phục việc ghép cặp giữa bộ gửi và 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à phần tử nhận và xử lý request bằng cách cho phép hơn 1 đối tượng có cơ hội xử lý request. Liên kết các đối tượng nhận request xuyên qua từng đối tượng xử lý đến khi gặp đối tượng xử lý cụ thể.
- Command: Mỗi yêu cầu thực hiện thao tác nào đó được 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ể thông số hóa 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…
- Interpreter: Xác định một biểu diễn ngữ pháp cho một ngôn ngữ và cung cấp trình thông dịch để xử lý ngữ pháp. Trình biên dịch Java là ví dụ tốt nhất về mô hình này.
- Iterator: cung cấp một cách chuẩn để duyệt qua một nhóm đối tượng.
- Mediator: Định nghĩa một đối tượng để bọc việc giao tiếp giữ một số đối tượng với nhau.
- Memento: Lưu trạng thái của một đối tượng để chúng ta có thể khôi phục nó sau này.
- 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.
- Strategy: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 với chương trình sử dụng thuật toán. Cung cấp một chiến thuật cho phép khách hàng chọn lựa linh động một chiến thuật cụ thể khi sử dụng
- Template Method: Sử dụng để thay đổi hành vi của một đối tượng dựa trên trạng thái của nó.
- 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 đó.
Ưu điểm của Design Pattern trong Java
- Chúng ta có thể sử dụng lại design pattern trong Java trong nhiều dự án
- Chúng giúp chúng ta xác định kiến trúc hệ thống
- Cung cấp sự minh bạch cho thiết kế ứng dụng
- Mẫu thiết kế là các giải pháp đã được chứng minh và thử nghiệm. Chúng được xây dựng trên kiến thức và kinh nghiệm của các nhà phát triển phần mềm chuyên nghiệp.
- Các mẫu thiết kế không đảm bảo giải pháp tuyệt đối cho một vấn đề
Khi nào chúng ta nên sử dụng Java Design Patterns ?
Chúng ta nên sử dụng design pattern trong giai đoạn phân tích và yêu cầu SDLC ( Vòng đời phát triển phần mềm). Chúng ta có thể sử dụng chung để dễ dàng phân tích và giai đoạn yêu cầu của SDLC bằng cách cung cấp thông tin dựa trên kinh nghiệm thực hành trước đó.
Kết luận
Trong bài viết này, chúng ta đã tìm hiểu về Design pattern trong Java cùng các ưu điểm của chúng. Hy vọng bạn đã nắm rõ các kiểu design Pattern trong Java và cách sử dụng chúng