首页 文章详情

Java 源码里的设计模式

Java高效学习 | 642 2020-10-20 12:39 0 0 0
UniSMS (合一短信)

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

长按关注,学习更多

推荐阅读

good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter