Câu trả lời:
Bạn có thể tìm thấy một cái nhìn tổng quan về rất nhiều mẫu thiết kế trong Wikipedia . Nó cũng đề cập đến các mẫu được đề cập bởi GoF. Tôi sẽ tổng hợp chúng ở đây và cố gắng chỉ định càng nhiều triển khai mẫu càng tốt, được tìm thấy trong cả API Java SE và Java EE.
javax.xml.parsers.DocumentBuilderFactory#newInstance()
javax.xml.transform.TransformerFactory#newInstance()
javax.xml.xpath.XPathFactory#newInstance()
java.lang.StringBuilder#append()
(không đồng bộ)java.lang.StringBuffer#append()
(đồng bộ hóa)java.nio.ByteBuffer#put()
(cũng trên CharBuffer
, ShortBuffer
, IntBuffer
, LongBuffer
, FloatBuffer
và DoubleBuffer
)javax.swing.GroupLayout.Group#addComponent()
java.lang.Appendable
java.util.stream.Stream.Builder
java.util.Calendar#getInstance()
java.util.ResourceBundle#getBundle()
java.text.NumberFormat#getInstance()
java.nio.charset.Charset#forName()
java.net.URLStreamHandlerFactory#createURLStreamHandler(String)
(Trả về đối tượng singleton trên mỗi giao thức)java.util.EnumSet#of()
javax.xml.bind.JAXBContext#createMarshaller()
và các phương pháp tương tự khácjava.lang.Object#clone()
(lớp phải thực hiện java.lang.Cloneable
)java.util.Arrays#asList()
java.util.Collections#list()
java.util.Collections#enumeration()
java.io.InputStreamReader(InputStream)
(trả về a Reader
)java.io.OutputStreamWriter(OutputStream)
(trả về a Writer
)javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
và #unmarshal()
new LinkedHashMap(LinkedHashSet<K>, List<V>)
trả về một bản đồ được liên kết không thể thay đổi, không sao chép các mục, nhưng sử dụng chúng. Các phương pháp java.util.Collections#newSetFromMap()
và singletonXXX()
tuy nhiên đến gần.java.awt.Container#add(Component)
(thực tế là tất cả trên Swing do đó)javax.faces.component.UIComponent#getChildren()
(thực tế là trên tất cả các giao diện người dùng JSF)java.io.InputStream
, OutputStream
, Reader
và Writer
có một constructor lấy một thể hiện của cùng loại.java.util.Collections
, Các checkedXXX()
, synchronizedXXX()
và unmodifiableXXX()
phương pháp.javax.servlet.http.HttpServletRequestWrapper
và HttpServletResponseWrapper
javax.swing.JScrollPane
javax.faces.context.FacesContext
, Nó nội bộ sử dụng số những người khác các loại giao diện / trừu tượng LifeCycle
, ViewHandler
, NavigationHandler
và nhiều hơn nữa mà không có sự enduser phải lo lắng về nó (mà là tuy nhiên ghi đè bằng cách tiêm).javax.faces.context.ExternalContext
, Mà trong nội bộ sử dụng ServletContext
, HttpSession
, HttpServletRequest
, HttpServletResponse
vvjava.lang.Integer#valueOf(int)
(cũng trên Boolean
, Byte
, Character
, Short
, Long
và BigDecimal
)java.lang.reflect.Proxy
java.rmi.*
javax.ejb.EJB
( giải thích ở đây )javax.inject.Inject
( giải thích ở đây )javax.persistence.PersistenceContext
java.lang.Runnable
javax.swing.Action
java.util.Pattern
java.text.Normalizer
java.text.Format
javax.el.ELResolver
java.util.Iterator
(do đó trong số những người khác cũng có java.util.Scanner
!).java.util.Enumeration
java.util.Timer
(tất cả các scheduleXXX()
phương pháp)java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService
( invokeXXX()
và submit()
phương thức)java.util.concurrent.ScheduledExecutorService
(tất cả các scheduleXXX()
phương pháp)java.lang.reflect.Method#invoke()
java.util.Date
(các phương thức setter làm điều đó, Date
được biểu thị bên trong bởi một long
giá trị)java.io.Serializable
javax.faces.component.StateHolder
java.util.Observer
/ java.util.Observable
(hiếm khi được sử dụng trong thế giới thực)java.util.EventListener
(thực tế là trên toàn bộ Swing)javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener
javax.faces.lifecycle.LifeCycle#execute()
(được điều khiển bởi FacesServlet
, hành vi phụ thuộc vào giai đoạn hiện tại (trạng thái) của vòng đời JSF)java.util.Comparator#compare()
, được thực hiện bởi những người khác Collections#sort()
.javax.servlet.http.HttpServlet
, service()
và tất cả các doXXX()
phương thức thực hiện HttpServletRequest
và HttpServletResponse
và người triển khai phải xử lý chúng (và không được giữ chúng dưới dạng các biến thể hiện!).javax.servlet.Filter#doFilter()
java.io.InputStream
, java.io.OutputStream
, java.io.Reader
và java.io.Writer
.java.util.AbstractList
, java.util.AbstractSet
và java.util.AbstractMap
.javax.servlet.http.HttpServlet
, tất cả các doXXX()
phương thức theo mặc định sẽ gửi lỗi HTTP 405 "Phương thức không được phép" tới phản hồi. Bạn được tự do thực hiện không hoặc bất kỳ trong số họ.Observable
, Observer
)ContainerAdapter
, ComponentAdapter
, FocusAdapter
, KeyAdapter
, MouseAdapter
là không adapter; chúng thực sự là các đối tượng Null. Lựa chọn đặt tên kém của Sun.BufferedInputStream
có thể trang trí các luồng khác như FilterInputStream
)java.lang.Runtime#getRuntime()
là người độc thânButtonGroup
cho mẫu Người hòa giảiAction
, AbstractAction
có thể được sử dụng cho các biểu diễn trực quan khác nhau để thực thi cùng một mã -> Mẫu lệnhvà nhiều hơn nữa tôi đoán
clone()
phương pháp này có thể được sử dụng cho mục đích này.java.awt
và java.swing
gói khác nhau . Thật vậy, chúng chia sẻ các thuộc tính nội tại gần như giống hệt nhau và các thuộc tính bên ngoài là các thành phần UI khác nhau mà chúng nằm ở dạng UI.
RMI dựa trên Proxy.
Có thể trích dẫn một mẫu cho hầu hết 23 mẫu trong GoF:
Tôi không thể nghĩ ra các ví dụ trong Java cho 10 trên 23, nhưng tôi sẽ xem liệu tôi có thể làm tốt hơn vào ngày mai không. Đó là những gì chỉnh sửa dành cho.
Mặc dù tôi sắp xếp một chiếc đồng hồ bị hỏng với cái này, API Java XML sử dụng Factory rất nhiều. Ý tôi là chỉ cần nhìn vào cái này:
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);
...Vân vân và vân vân.
Ngoài ra, nhiều bộ đệm khác nhau (StringBuffer, ByteBuffer, StringBuilder) sử dụng Builder.
java.util.Collection # Iterator là một ví dụ hay về Phương thức Factory. Tùy thuộc vào lớp con cụ thể của Bộ sưu tập bạn sử dụng, nó sẽ tạo ra một triển khai Iterator. Bởi vì cả siêu lớp Factory (Bộ sưu tập) và Iterator được tạo đều là các giao diện, đôi khi nó bị nhầm lẫn với AbstractFactory. Hầu hết các ví dụ cho AbstractFactory trong câu trả lời được chấp nhận (BalusC) là các ví dụ về Factory , một phiên bản đơn giản của Phương thức Factory, không phải là một phần của các mẫu GoF gốc. Trong Facory, hệ thống phân cấp lớp Factory bị sụp đổ và nhà máy sử dụng các phương tiện khác để chọn sản phẩm được trả lại.
Một nhà máy trừu tượng có nhiều phương pháp nhà máy, mỗi phương pháp tạo ra một sản phẩm khác nhau. Các sản phẩm được sản xuất bởi một nhà máy dự định sẽ được sử dụng cùng nhau (máy in và hộp mực của bạn tốt hơn là từ cùng một nhà máy (trừu tượng). Như đã đề cập trong các câu trả lời ở trên các họ của các thành phần GUI AWT, khác nhau từ nền tảng đến nền tảng, là một ví dụ về điều này (mặc dù cách triển khai của nó khác với cấu trúc được mô tả trong Gof).
javax.lang.model.element
định nghĩa khách truy cập;) Tôi không chắc chắn liệudoXXX
vàdoFilter
có phải là "chiến lược" hay không.