Thứ Sáu, 24 tháng 2, 2017

Một số Design Patterns phổ biến

Design Patterns cung cấp giải pháp chuẩn và hiệu quả cho việc thiết kế phần mềm và giải quyết các vấn đề trong lập trình; Sử dụng lại mã nguồn, linh hoạt và chặt chẽ. Các thiết kế này hình thành trong quá trình xây dựng các hệ thống phần mềm, được các người có kinh nghiệm tổng hợp và soạn thảo ra.

Tuy nhiên, bạn phải lựa chọn đúng design pattern để giải quyết bài toán. Nếu không, việc phải thay đổi thiết kế quá nhiều để đáp ứng đúng yêu cầu nghiệp vụ dẫn đến khó bảo trì, phức tạp và không hiệu quả.

Sau đây là một số design patterns phổ biến, được chia vào các danh mục:

Creational Patterns (Các pattern cho việc Khởi tạo)

  • Abstract Factory:
  • Builder
  • Factory Method
  • Prototye
  • Singleton
 Structural Patterns (Các patterns về cấu trúc)
  • Adapter
  • Bridg
  • Composite
  • Decorator
  • Facade
  • Flyweight
  • Proxy

Behavioral Patterns (Các patterns về hành vi)

  • Chain of Responsibility
  • Command
  • Interpreter
  • Iterator
  • Mediator
  • Memento
  • Observer
  • State
  • Strategy
  • Template Method
  • Visitor

 Sau đây là các mô tả ngắn gọn và dễ hiểu nhất:

Abstract Factor:

+ Rất thường xuyên được sử dụng (5*)
+ Dùng một class-gọi là Factory để khởi tạo các object khác (tương đồng nhau), dựa vào một điều kiện phân biệt nào đó. Ví dụ: Ta dùng trong việc xây dựng một ứng dụng có thể sử dụng nhiều nguồn database khác nhau (Oracle, SQLServer, MySQL,...), chỉ khác nhau cách kết nối. Các phương thức truy vấn dữ liệu là giống nhau về mặt defining, chỉ khác nhau về mặt implement. Như vậy, dù thay đổi database (bằng cách thay đổi configuration, connection string) nhưng ta vẫn cho ra các kết quả (tương đối) giống nhau mà không phải chỉnh sửa nhiều.

Factory Method:

+ Rất thường xuyên được sử dụng (5*)
+ Cho phép dùng một interface để khởi tạo object. Tác dụng của pattern này đề cao tính mở rộng được. Ví dụ một ứng dụng quản lý tài liệu (document). Các Document sẽ tuân theo interface IDocument. Các document này có thể là TextFile, Word, Visio,... nhưng có những thuộc tính chung như: tác giả, kích thước, số trang,... Khi xuất hiện một dạng document khác như Excel chẳng hạn, chỉ việc implement IDocument

Prototype:

+ Không thường sử dụng lắm (3*).
+ Nó hay được sử dụng hơn khi xây dựng những applications dạng computer graphic như: CAD, GIS, games,...
+ Cũng giống như các pattern creational ở trên, nó cũng che giấu việc khởi tạo object với phía client. Tuy nhiên, thay vì tạo các object mới tinh, nó khởi tạo cùng các giá trị copy theo một nguyên mẫu (prototype) nào đó (clone)

Singleton:

+ Sử dụng khá thường xuyên (4*)
+ Đảm bảo một class chỉ có một instance được tạo và cung cấp một điểm toàn cục để truy cập nó.
+ Phần lớn các objects trong application có tác dụng/công việc của riêng chúng và hoạt động riêng theo dữ liệu của chúng. Tuy nhiên, một số đối tượng có trách nhiệm và phạm vi hoạt động rộng hơn mức toàn cục, ví dụ như quản lý giới hạn tài nguyên, giám sát tình trạng toàn bộ hệ thống.
+ Tác dụng nữa có pattern này là nâng cao hiệu năng làm việc. Các đối tượng ở đây sẽ không phải khởi tạo rồi hủy nhiều lần.

Adapter:

+ Sử dụng khá thường xuyên (4*)
+ Chuyển interface của một class sang một interface khác.
+ Ví dụ khi bạn sử dụng third party libraries, nhưng một số các hàm, các properties có vẻ không đúng với yêu cầu của client (expectation). Lúc này bạn sử dụng Adapter pattern. Lớp Target là lớp có thành phần đang không đúng yêu cầu, bạn tạo một lớp Adapter kế thừa từ lớp Target. Lớp Adaptee là một lớp thực sự thực thi lại, Adapter sẽ override và gọi hàm thực thi thật sự từ Adaptee.
 + Pattern này thường được sử dụng trong lập trình môi trường nơi các thành phần, các ứng dụng mới cần được tích hợp với nhau và làm việc cùng với các thành phần cũ.

 Composite:

+ Sử dụng khá thường xuyên (4*).
+ Sắp xếp các objects theo dạo dạng hình cây phân cấp.

Facade (mặt tiền):

+ Rất thường xuyên được sử dụng (5*)
+ Cung cấp một interface thống nhất cho một tập các interfaces trong một hệ thống con. Facade định nghĩa một high-level interface để tạo cho hệ thống con dễ sử dụng
+ Một class được viết làm đại diện, một hub cho các class trong hệ thống con. Class này tập trung các chức năng của các class riêng lẻ, sau đó tạo ra các chức năng về business logic hơn.

Proxy:

+ Sử dụng khá thường xuyên (4*).
+ Ví dụ khi bạn xây dựng ứng dụng mà có chức năng phụ thuộc vào remote resource (từ máy khác, từ server) hoặc là một object nào đó cần nhiều thời gian để load (parsing, ghi file...). Trong tình huống này ta áp dụng Proxy pattern, tạo một proxy object bên cạnh object gốc. Proxy sẽ đứng giữa và chuyển request cho object đích, kiểm soát về mặt truy cập. Client không cần quan tâm/nhận thấy là đang giao tiếp với Proxy hay là object gốc.

Command:

+ Sử dụng khá thường xuyên (4*).
+ Đóng gói một yêu cầu thành một object request, cho phép tham số chúng cho các request khác nhau.

Iterator:

+ Rất thường xuyên được sử dụng (5*)
+ Trong lập trình, chúng ta thường thao tác với collection of object. Các collections này lưu trữ dữ liệu như: Array, list, tree, graph struct... Thêm nữa, bạn có thể cần truy cập các phần tử trong collection với thứ tự rõ ràng: trước ra sau, sau lên trước, first/last, tìm kiếm,... Pattern Iterator giải quyết các vấn đề này bằng cách chia tách collection theo các chức năng riêng biệt.

Observer:

+ Rất thường xuyên được sử dụng (5*)
+ Định nghĩa một liên kết phụ thuộc one-to-many giữa các objects để mà khi một object thay đổi trạng thái, tất cả các object phụ thuộc (các object quan sát) nó đều nhận thấy và tự động thay đổi theo.
+ Khi xây dựng ứng dụng Web hay Windows form, chúng ta thường làm việc với events và event handlers; Events và Delegate.

Không có nhận xét nào:

Đăng nhận xét