Chuyển đến nội dung chính

Tìm trên CooLWJ

选择搜索范围,输入关键词后按回车。

Ngôn ngữ

JDK sử dụng những mẫu thiết kế nào?

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


Tranh minh họa thể hiện thiết kế phần mềm qua tách cà phê Java và cảnh lắp ráp

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


Bình luận

Đang gửi

Chọn giao diện yêu thích

Giao diện đã chọn áp dụng cho toàn trang.