Java 核心库中的 GoF 设计模式示例
2022-08-31 04:08:07
我正在学习GoF Java设计模式,我想看到一些现实生活中的例子。在Java的核心库中,这些设计模式有哪些很好的例子?
我正在学习GoF Java设计模式,我想看到一些现实生活中的例子。在Java的核心库中,这些设计模式有哪些很好的例子?
您可以在维基百科中找到许多设计模式的概述。它还提到了GoF提到的模式。我将在这里总结它们,并尝试分配尽可能多的模式实现,这些实现都可以在Java SE和Java EE API中找到。
javax.xml.parsers.DocumentBuilderFactory#newInstance()
javax.xml.transform.TransformerFactory#newInstance()
javax.xml.xpath.XPathFactory#newInstance()
java.lang.StringBuilder#append()
(unsynchronized)java.lang.StringBuffer#append()
(synced)java.nio.ByteBuffer#put()
(也用于 CharBuffer、ShortBuffer
、IntBuffer
、
LongBuffer
、FloatBuffer
和 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)
(Returns singleton object per protocol)java.util.EnumSet#of()
javax.xml.bind.JAXBContext#createMarshaller()
和其他类似的方法java.util.Arrays#asList()
java.util.Collections#list()
java.util.Collections#enumeration()
java.io.InputStreamReader(InputStream)
(返回Reader
)java.io.OutputStreamWriter(OutputStream)
(返回Writer
)javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
和 #unmarshal()
,java.util.Collections#newSetFromMap()
和 singletonXXX()
方法非常接近。new LinkedHashMap(LinkedHashSet<K>, List<V>)
java.awt.Container#add(Component)
(因此几乎遍布 Swing)javax.faces.component.UIComponent#getChildren()
(因此几乎遍布 JSF UI)java.io.InputStream
、OutputStream
、Reader
和 Writer
的所有子类都有一个采用相同类型实例的构造函数。java.util.Collections
、checkedXXX()
、synchronizedXXX()
和 unmodifiableXXX()
方法。javax.servlet.http.HttpServletRequestWrapper
和 HttpServletResponseWrapper
javax.swing.JScrollPane
javax.faces.context.FacesContext
,它在内部使用抽象/接口类型LifeCycle
,ViewHandler
,NavigationHandler
等等,而最终用户不必担心它(但是可以通过注入来覆盖)。javax.faces.context.ExternalContext
,内部使用ServletContext
,HttpSession
,HttpServletRequest
,HttpServletResponse
等。java.lang.reflect.Proxy
java.rmi.*
javax.ejb.EJB
(解释在这里)javax.inject.Inject
(此处说明)javax.persistence.PersistenceContext
java.lang.Runnable
的所有实现
javax.swing.Action
的所有实现
java.util.Iterator
的所有实现(因此其中还有 java.util.Scanner
!java.util.Enumeration
的所有实现
java.util.Timer
(所有方法)scheduleXXX()
java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService
(and methods)invokeXXX()
submit()
java.util.concurrent.ScheduledExecutorService
(所有方法)scheduleXXX()
java.lang.reflect.Method#invoke()
java.util.Date
(setter方法就是这样做的,内部由一个值表示)Date
long
java.io.Serializable
的所有实现
javax.faces.component.StateHolder
的所有实现
java.util.Observer
/java.util.Observable
(虽然很少在现实世界中使用)java.util.EventListener
的所有实现(因此几乎遍布 Swing)javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener
javax.faces.lifecycle.LifeCycle#execute()
(由 FacesServlet
控制,行为取决于 JSF 生命周期的当前阶段(状态))java.util.Comparator#compare()
,由等执行。Collections#sort()
javax.servlet.http.HttpServlet
,和所有方法都采用和实现者必须处理它们(而不是将它们作为实例变量来获取!service()
doXXX()
HttpServletRequest
HttpServletResponse
javax.servlet.Filter#doFilter()
java.io.InputStream,java.io.OutputStream
,java.io.Reader
和java.io.Writer
的所有
非抽象方法。java.util.AbstractList、java.util.AbstractSet
和 java.util.AbstractMap
的所有非
抽象方法。javax.servlet.http.HttpServlet
,默认情况下,所有方法都会向响应发送 HTTP 405“方法不允许”错误。您可以自由地实现任何或其中任何一个。doXXX()
Observable
Observer
)ContainerAdapter
ComponentAdapter
FocusAdapter
KeyAdapter
MouseAdapter
BufferedInputStream
FilterInputStream
)java.lang.Runtime#getRuntime()
是辛格尔顿ButtonGroup
对于中介模式Action
,可用于不同的可视表示来执行相同的代码 -> 命令模式AbstractAction
还有更多我想