Java 源码里的设计模式
Java 源码里的设计模式
从 维基百科 中,可以让你对大部分设计模式有一个概览,而且它也指出了哪些设计模式是 GoF 中规范.下面列出可以从 JavaSE 和 JavaEE 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.util.Calendar#getInstance()
- java.util.ResourceBundle#getBundle()
- java.text.NumberFormat#getInstance()
- java.nio.charset.Charset#forName()
- java.net.URLStreamHandlerFactory#createURLStreamHandler(String)
原型模式
- java.lang.Object#clone()(类需要实现 java.lang.Cloneable 接口)
单例模式
结构型模式
适配器模式
- java.util.Arrays#asList()
- java.io.InputStreamReader(InputStream) (返回 Reader)
- java.io.OutputStreamWriter(OutputStream)(返回 Writer)
- javax.xml.bind.annotation.adapters.XmlAdapter#marshal() 和 #unmarshal()
桥模式
暂时没有发现
合成模式
- java.awt.Container#add(Component)(Swing 中几乎所有类都使用)
- javax.faces.component.UIComponent#getChildren()(JSF UI 中几乎所有类都使用)
装饰模式
- java.io.InputStream, OutputStream, Reader 和 Writer 的所有子类都有一个使用 InputStream, OutputStream, Reader, Writer 的构造器
- java.util.Collections 中的 checkedXXX(), synchronizedXXX() 和 unmodifiableXXX() 方法
- javax.servlet.http.HttpServletRequestWrapper 和 HttpServletResponseWrapper
门面模式
javax.faces.context.FacesContext,其内部使用了 LifeCycle, ViewHandler, NavigationHandler 等接口或抽象类,没有这一个门面类,终端就需要考虑如何去使用接口或抽象类(实际上不需要,因为门面类通过反射完成了) javax.faces.context.ExternalContext, 其内部使用了 ServletContext, HttpSession, HttpServletRequest, HttpServletResponse 等
享元模式
代理模式
表现型模式
责任链模式
命令模式
解释器模式
迭代模式
中介模式
- 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(setXXX 方法更新的就是其内部的 Date 的值) java.io.Serializable 的所有实现javax.faces.component.StateHolder 的所有实现
观察者模式(订阅模式)
java.util.Observer/java.util.Observable(实际应用中,很少会用到) java.util.EventListener 的所有实现(几乎包含了所有 Swing 中使用到的类) javax.servlet.http.HttpSessionBindingListenerjavax.servlet.http.HttpSessionAttributeListenerjavax.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() 方法,这些方法默认返回 405 "Method Not Allowed" ,你可以自由地选择覆盖实现其中的一个或多个。
访问者模式
javax.lang.model.element.AnnotationValue 和 AnnotationValueVisitorjavax.lang.model.element.Element 和 ElementVisitorjavax.lang.model.type.TypeMirror 和 TypeVisitorjava.nio.file.FileVisitor 和 SimpleFileVisitor
附录拓展:
stackoverflow原址: http://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns-in-javas-core-libraries