Hệ thống các mẫu design pattern hiện có 23 mẫu được định nghĩa trong cuốn "Design patterns Elements of Reusable Object Oriented Software"
Có thể chúng ta đã gặp Design patterns ở đâu đó trong các ứng dụng, cũng có thể chúng ta đã từng sử dụng những mẫu tương tự như Design pattern để giải quyết những tình huống của mình, nhưng chúng ta không rõ hoặc không có một khái niệm gì về nó.
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).
Quyển sách là tập hợp 23 mẫu thiết kế được phát hành bởi Erich Gamma, Richard Helm, Ralph Johnson và John Vlissides, trong một nghiên cứu của họ năm 1995. Với tựa đề gốc là “Design Patterns: Elements of Reusable Object-Oriented Software”. Tạm dịch “Mẫu thiết kế: những thành phần tái sử dụng trong lập trình hướng đối tượng”. Họ được giới lập trình gọi là Bộ tứ Gang of Four, hay GoF. (ND: Bộ tứ ở đây là ẩn dụ với Tên nhóm nhạc nổi tiếng Gang Of Four của Anh hay Bộ tứ quyền lực Mafia trong tác phẩm Bố già hay là bộ tứ quyền lực chính trị của Trung quốc, ở VN cũng có bộ tứ quyền lực của Vietnam Next Top Model…).
Đã có rất nhiều sự thay đổi kể từ khi xuất hiện, một số trong 23 mẫu được sử dụng nhiều, số khác ít khi được sử dụng. Tôi sẽ nói đến đầy đủ 23 mẫu trong cuốn sách này, nhưng tôi sẽ nhấn mạnh ở những mẫu thường được sử dụng hơn. Và kể cả mẫu mới không có trong sách của GoF, trong chương 11.
Có một sự thật là, bạn không chỉ phải nhớ kỹ từng mẫu thiết kế, bạn phải hiểu sâu sắc về nó, để có thể áp dụng đúng đắn trong thực tiễn. Tôi cũng sẽ lưu ý nhiều về lập trình hướng đối tượng xuyên suốt quyển sách này. Lập trình hướng đối tượng OOP là một bước tiến tuyệt vời trong lĩnh vực lập trình. Nhưng có quá nhiều lập trình viên sử dụng chúng một cách tùy tiện, thiếu chiều sâu, và điều đó gây ra nhiều rắc rối tiềm ẩn.
Có thể chúng ta đã gặp Design patterns ở đâu đó trong các ứng dụng, cũng có thể chúng ta đã từng sử dụng những mẫu tương tự như Design pattern để giải quyết những tình huống của mình, nhưng chúng ta không rõ hoặc không có một khái niệm gì về nó.
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).
Quyển sách là tập hợp 23 mẫu thiết kế được phát hành bởi Erich Gamma, Richard Helm, Ralph Johnson và John Vlissides, trong một nghiên cứu của họ năm 1995. Với tựa đề gốc là “Design Patterns: Elements of Reusable Object-Oriented Software”. Tạm dịch “Mẫu thiết kế: những thành phần tái sử dụng trong lập trình hướng đối tượng”. Họ được giới lập trình gọi là Bộ tứ Gang of Four, hay GoF. (ND: Bộ tứ ở đây là ẩn dụ với Tên nhóm nhạc nổi tiếng Gang Of Four của Anh hay Bộ tứ quyền lực Mafia trong tác phẩm Bố già hay là bộ tứ quyền lực chính trị của Trung quốc, ở VN cũng có bộ tứ quyền lực của Vietnam Next Top Model…).
Đã có rất nhiều sự thay đổi kể từ khi xuất hiện, một số trong 23 mẫu được sử dụng nhiều, số khác ít khi được sử dụng. Tôi sẽ nói đến đầy đủ 23 mẫu trong cuốn sách này, nhưng tôi sẽ nhấn mạnh ở những mẫu thường được sử dụng hơn. Và kể cả mẫu mới không có trong sách của GoF, trong chương 11.
Có một sự thật là, bạn không chỉ phải nhớ kỹ từng mẫu thiết kế, bạn phải hiểu sâu sắc về nó, để có thể áp dụng đúng đắn trong thực tiễn. Tôi cũng sẽ lưu ý nhiều về lập trình hướng đối tượng xuyên suốt quyển sách này. Lập trình hướng đối tượng OOP là một bước tiến tuyệt vời trong lĩnh vực lập trình. Nhưng có quá nhiều lập trình viên sử dụng chúng một cách tùy tiện, thiếu chiều sâu, và điều đó gây ra nhiều rắc rối tiềm ẩn.
STT
|
Tên
|
Mục đích
|
Nhóm Creational
(nhóm kiến tạo)
|
||
1
|
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
|
||
Nhóm Structural
(nhóm cấu trúc)
|
||
6
|
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
|
||
7
|
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
|
||
8
|
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
|
||
9
|
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
|
||
10
|
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
|
||
11
|
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
|
||
12
|
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
|
||
Nhóm Behavioral
(nhóm tương tác)
|
||
13
|
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
|
||
14
|
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
|
||
15
|
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
|
||
16
|
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
|
||
17
|
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
|
||
18
|
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
|
||
19
|
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
|
||
20
|
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
|
||
21
|
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
|
||
22
|
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
|
||
23
|
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
|