我正在学习GoF Java设计模式,我想看到一些现实生活中的例子。Java核心库中有哪些设计模式的好例子?
Observable
Observer
ContainerAdapter
ComponentAdapter
FocusAdapter
KeyAdapter
MouseAdapter
BufferedInputStream
FilterInputStream
java.lang.Runtime#getRuntime()
ButtonGroup
Action
AbstractAction
我猜还有更多
DatagramSocketImplFactory
PreferencesFactory
同样,工厂模式也有相当多的实例。
尽管我对这一点有点不熟悉,但Java XML API经常使用Factory。我是说看看这个:
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source); String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);
...诸如此类。
此外,各种缓冲区(StringBuffer, ByteBuffer, StringBuilder)使用Builder。
clone()
RMI是基于Proxy的。
应该可以为GoF中的23种模式中的大多数引用一个:
在这23个例子中,我想不出10个是用Java写的,但我会看看明天是否能做得更好。这就是编辑的作用。
您可以在维基百科中找到许多设计模式的概述。它还提到了GoF提到的模式。我将在这里总结它们,并尝试分配尽可能多的模式实现,这些实现在Java SE和Java EE api中都可以找到。
javax.xml.parsers.DocumentBuilderFactory#newInstance()
javax.xml.transform.TransformerFactory#newInstance()
javax.xml.xpath.XPathFactory#newInstance()
java.nio.ByteBuffer#put()
CharBuffer
ShortBuffer
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.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
java.lang.reflect.Proxy
java.rmi.*
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
java.util。Collection#Iterator是工厂方法的一个很好的例子。根据您使用的Collection的具体子类,它将创建一个Iterator实现。因为Factory超类(Collection)和创建的Iterator都是接口,所以有时会与AbstractFactory混淆。在接受的答案(BalusC)中,AbstractFactory的大多数示例都是工厂的示例,这是工厂方法的简化版本,它不是原始GoF模式的一部分。在Factory中,Factory类层次结构被折叠,工厂使用其他方法选择要返回的产品。
抽象工厂有多个工厂方法,每个方法创建一个不同的产品。一家工厂生产的产品是为了一起使用(您的打印机和墨盒最好来自同一家(抽象)工厂)。正如上面的回答中提到的,不同平台的AWT GUI组件家族就是一个例子(尽管它的实现与Gof中描述的结构不同)。