Một,các mẫu cấu trúc
1,mẫu thiết kế Adapter
Dùng để chuyển một giao diện thành một giao diện khác
java.util.Arrays#asList()
javax.swing.JTable(TableModel)
java.io.InputStreamReader(InputStream)
java.io.OutputStreamWriter(OutputStream)
javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()
2,mẫu cầu nối
Mẫu thiết kế này tách biệt phần trừu tượng với phần triển khai các thao tác trừu tượng, cho phép phần trừu tượng và phần triển khai thay đổi độc lập
AWT (Cung cấp một lớp trừu tượng ánh xạ khả năng hỗ trợ hệ thống cửa sổ sang hệ điều hành gốc.)
JDBC
3,mẫu thiết kế Composite
khiến phía gọi xem đối tượng đơn lẻ và tổ hợp các đối tượng là tương đương nhau. Nói cách khác, phương thức của một kiểu cũng nhận chính kiểu đó làm tham số
javax.swing.JComponent#add(Component)
java.awt.Container#add(Component)
java.util.Map#putAll(Map)
java.util.List#addAll(Collection)
java.util.Set#addAll(Collection)
4,mẫu trang trí
Gắn thêm chức năng cho một đối tượng một cách linh hoạt trong lúc chạy, đây cũng là một phương án thay thế cho việc tạo lớp con. Có thể thấy rằng khi tạo một kiểu, ta đồng thời truyền vào một đối tượng cùng kiểu. Điều này rất thường gặp trong JDK, bạn sẽ thấy nó có mặt khắp nơi, vì vậy danh sách dưới đây chỉ là một phần nhỏ
java.io.BufferedInputStream(InputStream)
java.io.DataInputStream(InputStream)
java.io.BufferedOutputStream(OutputStream)
java.util.zip.ZipOutputStream(OutputStream)
java.util.Collections#checked<list |sortedmap |sortedset |set |map>
5,mẫu thiết kế Facade
Cung cấp một giao diện đơn giản cho một nhóm thành phần, giao diện, thành phần trừu tượng hoặc hệ thống con
java.lang.Class
javax.faces.webapp.FacesServlet
6,mẫu thiết kế Flyweight
Sử dụng bộ nhớ đệm để rút ngắn thời gian truy cập một lượng lớn đối tượng nhỏ
java.lang.Integer#valueOf(int)
java.lang.Boolean#valueOf(boolean)
java.lang.Byte#valueOf(byte)
java.lang.Character#valueOf(char)
7,Mẫu đại diện
Mẫu thiết kế Proxy sử dụng một đối tượng đơn giản để thay thế một đối tượng phức tạp hoặc tốn nhiều thời gian khởi tạo.
java.lang.reflect.Proxy
RMI

Hai, các mẫu khởi tạo
1,Mẫu thiết kế nhà máy trừu tượng
Mẫu thiết kế Abstract Factory cung cấp một giao thức để tạo ra một loạt đối tượng có liên quan hoặc độc lập mà không cần chỉ định kiểu của đối tượng cụ thể。Nó giúp ứng dụng tách biệt khỏi phần triển khai cụ thể của framework đang sử dụng。Điều này có thể thấy ở khắp nơi trong JDK hoặc nhiều framework như Spring。Chúng cũng rất dễ nhận biết, một phương thức tạo đối tượng mới nhưng trả về một interface hoặc lớp trừu tượng thì đó chính là mẫu thiết kế Abstract Factory
java.util.Calendar#getInstance()
java.util.Arrays#asList()
java.util.ResourceBundle#getBundle()
java.sql.DriverManager#getConnection()
java.sql.Connection#createStatement()
java.sql.Statement#executeQuery()
java.text.NumberFormat#getInstance()
javax.xml.transform.TransformerFactory#newInstance()
2,Mẫu thiết kế xây dựng(Builder)
Định nghĩa một lớp mới để tạo thể hiện của một lớp khác, nhằm đơn giản hóa việc tạo các đối tượng phức tạp。Mẫu thiết kế Builder thường cũng sử dụng chuỗi lời gọi phương thức để triển khai
java.lang.StringBuilder#append()
java.lang.StringBuffer#append()
java.sql.PreparedStatement
javax.swing.GroupLayout.Group#addComponent()
3,Phương thức nhà máy
chính là một phương thức trả về đối tượng cụ thể
java.lang.Proxy#newProxyInstance()
java.lang.Object#toString()
java.lang.Class#newInstance()
java.lang.reflect.Array#newInstance()
java.lang.reflect.Constructor#newInstance()
java.lang.Boolean#valueOf(String)
java.lang.Class#forName()
4,mẫu thiết kế Prototype
cho phép thể hiện của lớp tạo ra bản sao của chính nó. Nếu việc tạo một thể hiện của đối tượng rất phức tạp và tốn thời gian, có thể sử dụng mẫu thiết kế này, bạn có thể sao chép một đối tượng rồi sửa trực tiếp bản sao ấy thay vì tạo lại một thể hiện mới
java.lang.Object#clone()
java.lang.Cloneable
5, mẫu Singleton
Dùng để bảo đảm một lớp chỉ có một thể hiện. Trong Effetive Java, Joshua Bloch đề xuất rằng còn một cách khác là sử dụng kiểu liệt kê
java.lang.Runtime#getRuntime()
java.awt.Toolkit#getDefaultToolkit()
java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()
java.awt.Desktop#getDesktop()
Ba,mẫu hành vi
1,mẫu thiết kế chuỗi trách nhiệm
Bằng cách chuyển yêu cầu từ một đối tượng sang đối tượng tiếp theo trong chuỗi cho đến khi yêu cầu được xử lý xong, qua đó tách rời sự phụ thuộc giữa các đối tượng
java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()
2,mẫu lệnh
Đóng gói thao tác trong đối tượng để có thể lưu trữ, truyền và trả về
java.lang.Runnable
javax.swing.Action
3,mẫu thiết kế thông dịch
Mẫu thiết kế này thường định nghĩa ngữ pháp của một ngôn ngữ, sau đó phân tích các câu lệnh theo ngữ pháp tương ứng
java.util.Pattern
java.text.Normalizer
java.text.Format
4,mẫu thiết kế bộ lặp
Cung cấp một phương thức thống nhất để truy cập tuần tự các đối tượng trong tập hợp, không phụ thuộc vào cách triển khai cụ thể của tập hợp bên dưới
java.util.Iterator
java.util.Enumeration
5,mẫu thiết kế Trung gian
Sử dụng một đối tượng trung gian để phân phối thông điệp và giảm sự phụ thuộc trực tiếp giữa các lớp
java.util.Timer
java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService#submit()
java.lang.reflect.Method#invoke()
6,mẫu thiết kế Memento
Tạo một ảnh chụp trạng thái của đối tượng để đối tượng có thể khôi phục trạng thái ban đầu mà không cần tiết lộ nội dung của chính nó. Đối tượng Date triển khai mẫu thiết kế Memento bằng một giá trị long bên trong nó
java.util.Date
java.io.Serializable
7,Mẫu thiết kế đối tượng rỗng
Mẫu thiết kế này dùng một đối tượng không mang ý nghĩa để thay thế trạng thái không có đối tượng. Nhờ đó bạn không cần xử lý thêm đối với đối tượng rỗng
java.util.Collections#emptyList()
java.util.Collections#emptyMap()
java.util.Collections#emptySet()
8,mẫu thiết kế Observer
Nó cho phép một đối tượng linh hoạt gửi thông điệp đến những đối tượng quan tâm
java.util.EventListener
javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener
9,mẫu trạng thái
Thông qua việc thay đổi trạng thái bên trong đối tượng, bạn có thể thay đổi linh hoạt hành vi của một đối tượng khi chương trình đang chạy
java.util.Iterator
javax.faces.lifecycle.LifeCycle#execute()
10,mẫu chiến lược
Dùng mẫu thiết kế này để đóng gói một nhóm thuật toán thành một loạt đối tượng. Bằng cách truyền các đối tượng này, có thể linh hoạt thay đổi chức năng của chương trình
java.util.Comparator#compare()
javax.servlet.http.HttpServlet
javax.servlet.Filter#doFilter()
11,mẫu phương thức khuôn mẫu
Cho phép lớp con ghi đè một phần của phương thức thay vì ghi đè toàn bộ, bạn có thể kiểm soát những thao tác nào lớp con cần ghi đè
java.util.Collections#sort()
java.io.InputStream#skip()
java.io.InputStream#read()
java.util.AbstractList#indexOf()
12,mẫu thiết kế Visitor
Cung cấp một cách thuận tiện, dễ bảo trì để thao tác với một nhóm đối tượng. Nó cho phép bạn sửa đổi hoặc mở rộng hành vi của đối tượng mà không thay đổi các đối tượng đang được thao tác
javax.lang.model.element.Element và javax.lang.model.element.ElementVisitor
javax.lang.model.type.TypeMirror và javax.lang.model.type.TypeVisitor
Chú thích của người dịch:Nhiều chỗ có thể còn gây tranh luận, nhưng việc chúng có thuộc một mẫu thiết kế nào đó hay không thực ra không quá quan trọng; điều quan trọng là cách thiết kế của chúng có thể mang lại kinh nghiệm giúp chúng ta cải thiện mã nguồn