这个问题的答案是 社区的努力。编辑现有答案以改进这篇文章。它目前不接受新的答案或交互。
我正在学习 GoF Java 设计模式,我想看看它们的一些真实示例。Java 核心库中这些设计模式的一些很好的例子是什么?
您可以在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.lang.Object#clone()
java.lang.Cloneable
的实例(通常是其自身))
java.lang.Runtime#getRuntime()
java.awt.Desktop#getDesktop()
java.lang.System#getSecurityManager()
抽象/接口类型的实例并返回自己/另一个抽象/接口类型的实现来 装饰/覆盖 给定实例的创建方法识别)
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)
javax.faces.component.UIComponent#getChildren()
相同 抽象/接口类型的实例,增加了额外的行为)
java.io.InputStream
OutputStream
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.Integer#valueOf(int)
Boolean
Byte
Character
Short
Long
BigDecimal
(可通过创建方法识别,该方法返回给定抽象/接口类型的实现,而后者又 委托/使用 给定抽象/接口类型的 不同 实现)
java.lang.reflect.Proxy
java.rmi.*
javax.ejb.EJB
javax.inject.Inject
javax.persistence.PersistenceContext
(可通过行为方法识别,该行为方法(间接)在队列中 相同 抽象/接口类型的 另一个 实现中调用相同的方法) __
java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()
(可通过抽象/接口类型中的行为方法识别,该类型调用 不同 抽象/接口类型的实现中的方法,该抽象/接口类型在创建期间已由命令实现 封装)
java.lang.Runnable
javax.swing.Action
不同的实例/类型的行为方法识别;请注意,解析/格式化不是模式的一部分,确定模式以及如何应用它) __
java.util.Pattern
java.text.Normalizer
java.text.Format
javax.el.ELResolver
不同类型的实例)
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
java.lang.reflect.Method#invoke()
实例状态的行为方法识别)
java.util.Date
Date
long
java.io.Serializable
javax.faces.component.StateHolder
(可通过行为方法识别,该行为方法调用 另一个 抽象/接口类型的实例上的方法,取决于自己的状态)
java.util.Observer
java.util.Observable
java.util.EventListener
javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener
(可通过行为方法识别,该方法根据实例的状态改变其行为,可以从外部控制)
javax.faces.lifecycle.LifeCycle#execute()
FacesServlet
(可通过抽象/接口类型中的行为方法识别,它调用 不同 抽象/接口类型的实现中的方法,该方法已作为方法参数 传入 策略实现)
java.util.Comparator#compare()
Collections#sort()
javax.servlet.http.HttpServlet
service()
doXXX()
(可由已经具有由抽象类型定义的“默认”行为的行为方法识别)
java.io.OutputStream
java.io.Reader
java.io.Writer
java.util.AbstractList
java.util.AbstractSet
java.util.AbstractMap
的抽象/接口类型识别,这些类型定义了方法,这些方法采用 其他 抽象/接口类型;一个实际上调用另一个的方法,另一个在其上执行所需的策略)
javax.lang.model.element.AnnotationValue
AnnotationValueVisitor
javax.lang.model.element.Element
ElementVisitor
javax.lang.model.type.TypeMirror
TypeVisitor
java.nio.file.FileVisitor
SimpleFileVisitor
javax.faces.component.visit.VisitContext
VisitCallback