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, FloatBuffervà DoubleBuffer)javax.swing.GroupLayout.Group#addComponent()java.lang.Appendablejava.util.stream.Stream.Builderjava.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, Readervà Writercó 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à HttpServletResponseWrapperjavax.swing.JScrollPanejavax.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, NavigationHandlervà 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, HttpServletResponsevvjava.lang.Integer#valueOf(int)(cũng trên Boolean, Byte, Character, Short, Longvà BigDecimal)java.lang.reflect.Proxyjava.rmi.*javax.ejb.EJB( giải thích ở đây )javax.inject.Inject( giải thích ở đây )javax.persistence.PersistenceContextjava.lang.Runnablejavax.swing.Actionjava.util.Patternjava.text.Normalizerjava.text.Formatjavax.el.ELResolverjava.util.Iterator(do đó trong số những người khác cũng có java.util.Scanner!).java.util.Enumerationjava.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 longgiá trị)java.io.Serializablejavax.faces.component.StateHolderjava.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.HttpSessionBindingListenerjavax.servlet.http.HttpSessionAttributeListenerjavax.faces.event.PhaseListenerjavax.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 HttpServletRequestvà HttpServletResponsevà 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.Readervà java.io.Writer.java.util.AbstractList, java.util.AbstractSetvà 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, MouseAdapterlà 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.BufferedInputStreamcó 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, AbstractActioncó 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.awtvà java.swinggó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ệudoXXXvàdoFiltercó phải là "chiến lược" hay không.