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.lang.Runtime#getRuntime() java.awt.Desktop#getDesktop() java.lang.System#getSecurityManager()
结构型模式
适配器模式
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.lang.Integer#valueOf(int),类似得还有 Boolean, Byte, Character, Short 和 Long
代理模式
java.lang.reflect.Proxy java.rmi.*(所有 api)
表现型模式
责任链模式
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 中的所有 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
长按关注,学习更多
推荐阅读