Answers:
您可以在Wikipedia中找到许多设计模式的概述。它还提到了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()
(未同步)java.lang.StringBuffer#append()
(已同步)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)
(根据协议返回单例对象)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()
new LinkedHashMap(LinkedHashSet<K>, List<V>)
返回一个不可修改的链接地图,该地图不会克隆项目,而是使用它们。但是java.util.Collections#newSetFromMap()
和singletonXXX()
方法非常接近。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
(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
,doXXX()
默认情况下,所有方法都会向响应发送HTTP 405“不允许使用方法”错误。您可以随意实现任何一个或任何一个。Observable
,Observer
)ContainerAdapter
,ComponentAdapter
,FocusAdapter
,KeyAdapter
,MouseAdapter
是不适配器; 它们实际上是空对象。Sun命名选择不佳。BufferedInputStream
可以装饰其他流,例如FilterInputStream
)java.lang.Runtime#getRuntime()
是辛格尔顿ButtonGroup
用于调解员模式Action
,AbstractAction
可用于不同的视觉表示以执行相同的代码->命令模式我猜还有更多
clone()
可以算在内,但是我认为方法可以用于此目的。java.awt
和java.swing
包不同。实际上,它们共享几乎相同的内在属性,外在属性是它们以UI形式布置的不同UI组件。
RMI基于代理。
应该可以为GoF中的23种模式中的大多数引用一种:
我想不出Java中的23个例子中有10个,但是我看看明天是否可以做得更好。这就是编辑的目的。
java.util.Collection#Iterator是Factory方法的一个很好的例子。根据您使用的Collection的具体子类,它将创建一个Iterator实现。因为创建的Factory超类(集合)和迭代器都是接口,所以有时将它与AbstractFactory混淆。可接受答案(BalusC)中AbstractFactory的大多数示例都是Factory的示例,Factory是工厂方法的简化版本,它不属于原始GoF模式。在Facory中,Factory类层次结构被折叠,并且工厂使用其他方式选择要退货的产品。
抽象工厂有多种工厂方法,每种方法创建不同的产品。一个工厂生产的产品打算一起使用(您的打印机和墨盒最好来自同一(抽象的)工厂)。正如上面答案中提到的,不同平台的AWT GUI组件家族就是一个例子(尽管其实现方式与Gof中描述的结构不同)。
javax.lang.model.element
定义的游客;)我不是很确定是否doXXX
和doFilter
在“策略”。