Java核心库中的GoF设计模式示例

我正在学习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() (synchronized)
  • java.nio.ByteBuffer#put()CharBufferShortBufferIntBufferLongBufferFloatBufferDoubleBuffer
  • 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
  • Singleton(可以通过创建方法每次都返回相同的实例(通常是它本身))

  • 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) (因此几乎遍布Swing)
  • javax.faces.component.UIComponent#getChildren() (几乎遍布JSF UI)
  • 装饰者(可以通过创造性方法识别出具有相同抽象/接口类型的实例,从而增加额外的行为)

  • java.io.InputStreamOutputStreamReaderWriter所有子类都有一个构造函数,它具有相同类型的实例。
  • java.util.CollectionscheckedXXX()synchronizedXXX()unmodifiableXXX()方法。
  • javax.servlet.http.HttpServletRequestWrapperHttpServletResponseWrapper
  • javax.swing.JScrollPane
  • Facade(可由内部使用不同独立抽象/接口类型的实例的行为方法识别)

  • javax.faces.context.FacesContext ,它内部使用了LifeCycleViewHandlerNavigationHandler等多种抽象/接口类型,但没有终端用户需要担心它(但是可以通过注入来覆盖)。
  • javax.faces.context.ExternalContext ,它内部使用ServletContextHttpSessionHttpServletRequestHttpServletResponse等。
  • 享元(可以通过创建方法识别返回缓存实例,有点“多重”的想法)

  • java.lang.Integer#valueOf(int) (同样在BooleanByteCharacterShortLongBigDecimal
  • 代理(可由创建方法识别,该方法返回给定抽象/接口类型的实现,然后委派/使用给定抽象/接口类型的不同实现)

  • 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.ExecutorServiceinvokeXXX()submit()方法)
  • java.util.concurrent.ScheduledExecutorService (所有scheduleXXX()方法)
  • java.lang.reflect.Method#invoke()
  • 纪念品(可以通过内部改变整个实例状态的行为方法识别)

  • java.util.Date (setter方法这样做, Date由内部的long值表示)
  • java.io.Serializable所有实现
  • javax.faces.component.StateHolder所有实现
  • 观察者(或发布/订阅)(可由行为方法识别,这些行为方法根据自己的状态在另一个抽象/接口类型的实例上调用方法)

  • java.util.Observer / java.util.Observable (尽管在现实世界java.util.Observable很少使用)
  • java.util.EventListener所有实现(因此几乎遍布Swing)
  • javax.servlet.http.HttpSessionBindingListener
  • javax.servlet.http.HttpSessionAttributeListener
  • javax.faces.event.PhaseListener
  • 状态(可以通过行为方法识别,根据实例的状态改变其行为,可以从外部控制状态)

  • javax.faces.lifecycle.LifeCycle#execute() (由FacesServlet控制,行为取决于JSF生命周期的当前阶段(状态))
  • 策略(行为方法在抽象/接口类型中可以识别,该类型在实现不同的抽象/接口类型的方法中已经作为方法参数传入策略实现中)

  • java.util.Comparator#compare() ,由其他人执行Collections#sort()
  • javax.servlet.http.HttpServletservice()和所有的doXXX()方法都使用HttpServletRequestHttpServletResponse ,实现者必须处理它们(而不是将它们作为实例变量!)。
  • javax.servlet.Filter#doFilter()
  • 模板方法(可以通过已经具有由抽象类型定义的“默认”行为的行为方法识别)

  • java.io.InputStreamjava.io.OutputStreamjava.io.Readerjava.io.Writer所有非抽象方法。
  • java.util.AbstractListjava.util.AbstractSetjava.util.AbstractMap所有非抽象方法。
  • javax.servlet.http.HttpServlet ,默认情况下所有的doXXX()方法都会向响应发送一个HTTP 405“Method Not Allowed”错误。 你可以自由地实现任何一个或其中任何一个。
  • 访问者(可以通过两种不同的抽象/接口类型来识别,这些抽象/接口类型具有定义方法,该方法定义了每个其他抽象/接口类型;一个实际调用另一个的方法,另一个执行所需的策略)

  • javax.lang.model.element.AnnotationValueAnnotationValueVisitor
  • javax.lang.model.element.ElementElementVisitor
  • javax.lang.model.type.TypeMirrorTypeVisitor
  • java.nio.file.FileVisitorSimpleFileVisitor
  • javax.faces.component.visit.VisitContextVisitCallback

  • 观察者模式贯穿整个秋千( ObservableObserver
  • MVC也在摆动
  • 适配器模式:InputStreamReader和OutputStreamWriter注意: ContainerAdapterComponentAdapterFocusAdapterKeyAdapterMouseAdapter不是适配器; 他们实际上是空对象。 Sun命名选择不佳。
  • 装饰模式( BufferedInputStream可以装饰其他流,例如FilterInputStream
  • AWT工具包和Swing可插入外观类的AbstractFactory模式
  • java.lang.Runtime#getRuntime()是单例
  • 调解者模式的ButtonGroup
  • ActionAbstractAction可以用于不同的视觉表示来执行相同的代码 - >命令模式
  • 用于Flyweight模式的JTable中的Interned Strings或CellRender(也可以考虑各种池 - 线程池,连接池,EJB对象池 - Flyweight实际上是关于共享资源的管理)
  • 与Servlet过滤器一样,Java 1.0事件模型是责任链的一个例子。
  • 集合框架中的迭代器模式
  • AWT / Swing中的嵌套容器使用复合模式
  • AWT / Swing中的布局管理员是战略的一个例子
  • 还有更多我猜


  • Flyweight与Byte,Short,Integer,Long和String的一些值一起使用。
  • Facade被用在许多地方,但最明显的是脚本接口。
  • 想到Singleton - java.lang.Runtime。
  • 抽象工厂 - 也是脚本和JDBC API。
  • 命令 - TextComponent的撤销/重做。
  • 解释器 - RegEx(java.util.regex。)和SQL(java.sql。)API。
  • 原型 - 不是100%肯定如果这个计数,但我认为clone()方法可以用于此目的。
  • 链接地址: http://www.djcxy.com/p/8861.html

    上一篇: Examples of GoF Design Patterns in Java's core libraries

    下一篇: Interface vs Base class