gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:12:14 26 4
gpt4 key购买 nike

这个问题的答案是community effort .编辑现有答案以改进这篇文章。它目前不接受新的答案或互动。








我正在学习 GoF Java 设计模式,我想看看它们的一些真实例子。 Java 核心库中这些设计模式的一些很好的例子是什么?

最佳答案

您可以在 Wikipedia 中找到许多设计模式的概述。 .它还提到了 GoF 提到了哪些模式。我将在这里总结它们并尝试分配尽可能多的模式实现,这些实现在 Java SE 和 Java EE API 中都可以找到。

Creational patterns
Abstract factory (可通过返回工厂本身的创建方法识别,工厂本身又可用于创建另一个抽象/接口(interface)类型)

  • javax.xml.parsers.DocumentBuilderFactory#newInstance()
  • javax.xml.transform.TransformerFactory#newInstance()
  • javax.xml.xpath.XPathFactory#newInstance()

  • Builder (可通过返回实例本身的创建方法识别)
  • java.lang.StringBuilder#append() (未同步)
  • java.lang.StringBuffer#append() (同步)
  • java.nio.ByteBuffer#put() (也在 CharBuffer ShortBuffer IntBuffer LongBuffer FloatBuffer DoubleBuffer 上)
  • javax.swing.GroupLayout.Group#addComponent()
  • java.lang.Appendable 的所有实现
  • java.util.stream.Stream.Builder

  • Factory method (可通过返回抽象/接口(interface)类型实现的创建方法识别)
  • java.util.Calendar#getInstance()
  • java.util.ResourceBundle#getBundle()
  • java.text.NumberFormat#getInstance()
  • java.nio.charset.Charset#forName()
  • java.net.URLStreamHandlerFactory#createURLStreamHandler(String) (每个协议(protocol)返回单例对象)
  • java.util.EnumSet#of()
  • javax.xml.bind.JAXBContext#createMarshaller() 和其他类似的方法

  • Prototype (可通过返回具有相同属性的不同实例的创建方法识别)
  • java.lang.Object#clone() (该类必须实现 java.lang.Cloneable )

  • Singleton (可以通过每次返回相同实例(通常是其自身)的创建方法识别)
  • java.lang.Runtime#getRuntime()
  • java.awt.Desktop#getDesktop()
  • java.lang.System#getSecurityManager()

  • Structural patterns
    Adapter (可通过采用不同抽象/接口(interface)类型的实例并返回装饰/覆盖给定实例的自己/另一个抽象/接口(interface)类型的实现的创建方法识别)
  • 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()

  • Bridge (可通过采用不同抽象/接口(interface)类型的实例并返回委托(delegate)/使用给定实例的自己的抽象/接口(interface)类型的实现的创建方法识别)
  • 还没有想到。一个虚构的例子是 new LinkedHashMap(LinkedHashSet<K>, List<V>)它返回一个不可修改的链接映射,它不会克隆项目,而是使用它们。 java.util.Collections#newSetFromMap() singletonXXX() 然而,方法接近。

  • Composite (可通过行为方法将相同抽象/接口(interface)类型的实例识别为树结构)
  • java.awt.Container#add(Component) (因此几乎遍布 Swing)
  • javax.faces.component.UIComponent#getChildren() (因此几乎遍布 JSF UI)

  • Decorator (可以通过采用相同抽象/接口(interface)类型的实例的创建方法识别,这增加了额外的行为)
  • java.io.InputStream 的所有子类, OutputStream , Reader Writer 有一个构造函数采用相同类型的实例。
  • java.util.Collections , checkedXXX() , synchronizedXXX() unmodifiableXXX() 方法。
  • javax.servlet.http.HttpServletRequestWrapper HttpServletResponseWrapper
  • javax.swing.JScrollPane

  • Facade (可通过内部使用不同独立抽象/接口(interface)类型实例的行为方法识别)
  • javax.faces.context.FacesContext ,它在内部使用抽象/接口(interface)类型 LifeCycle , ViewHandler , NavigationHandler 还有更多,最终用户不必担心它(但是可以通过注入(inject)覆盖)。
  • javax.faces.context.ExternalContext ,内部使用 ServletContext , HttpSession , HttpServletRequest , HttpServletResponse

  • Flyweight (可以通过返回缓存实例的创建方法识别,有点“multiton”的想法)
  • java.lang.Integer#valueOf(int) (也在 Boolean Byte Character Short Long BigDecimal 上)

  • Proxy (可通过创建方法识别,该方法返回给定抽象/接口(interface)类型的实现,而该实现又委托(delegate)/使用给定抽象/接口(interface)类型的不同实现)
  • java.lang.reflect.Proxy
  • java.rmi.*
  • javax.ejb.EJB ( explanation here )
  • javax.inject.Inject ( explanation here )
  • javax.persistence.PersistenceContext

  • Behavioral patterns
    Chain of responsibility (可通过行为方法识别,这些方法(间接)在队列中相同抽象/接口(interface)类型的另一个实现中调用相同的方法)
  • java.util.logging.Logger#log()
  • javax.servlet.Filter#doFilter()

  • Command (可通过抽象/接口(interface)类型中的行为方法识别,该类型调用不同抽象/接口(interface)类型的实现中的方法,该抽象/接口(interface)类型在其创建期间已被命令实现封装)
  • java.lang.Runnable 的所有实现
  • javax.swing.Action 的所有实现

  • Interpreter (可通过行为方法识别,返回给定实例/类型的结构上不同的实例/类型;注意解析/格式化不是模式的一部分,确定模式以及如何应用它是)
  • java.util.Pattern
  • java.text.Normalizer
  • java.text.Format 的所有子类
  • javax.el.ELResolver 的所有子类

  • Iterator (可通过行为方法识别,从队列中依次返回不同类型的实例)
  • java.util.Iterator 的所有实现(因此还有 java.util.Scanner !)。
  • java.util.Enumeration 的所有实现

  • Mediator (可通过采用不同抽象/接口(interface)类型(通常使用命令模式)的实例的行为方法识别,该实例委托(delegate)/使用给定的实例)
  • 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()

  • Memento (可通过行为方法识别,在内部改变整个实例的状态)
  • java.util.Date (setter 方法这样做,Date 在内部由 long 值表示)
  • java.io.Serializable 的所有实现
  • javax.faces.component.StateHolder 的所有实现

  • Observer (or Publish/Subscribe) (可通过行为方法识别,该方法在另一个抽象/接口(interface)类型的实例上调用方法,具体取决于自己的状态)
  • java.util.Observer / java.util.Observable (虽然在现实世界中很少使用)
  • java.util.EventListener 的所有实现(因此几乎遍布 Swing)
  • javax.servlet.http.HttpSessionBindingListener
  • javax.servlet.http.HttpSessionAttributeListener
  • javax.faces.event.PhaseListener

  • State (可通过行为方法识别,该方法根据可以从外部控制的实例状态改变其行为)
  • javax.faces.lifecycle.LifeCycle#execute() (由 FacesServlet 控制,行为取决于 JSF 生命周期的当前阶段(状态))

  • Strategy (可通过抽象/接口(interface)类型中的行为方法识别,该类型调用已作为方法参数传入策略实现的不同抽象/接口(interface)类型的实现中的方法)
  • java.util.Comparator#compare() ,由其他人执行 Collections#sort() .
  • javax.servlet.http.HttpServlet , service()和所有 doXXX()方法取HttpServletRequestHttpServletResponse并且实现者必须处理它们(而不是将它们作为实例变量!)。
  • javax.servlet.Filter#doFilter()

  • Template method (可以通过已经具有由抽象类型定义的“默认”行为的行为方法识别)
  • 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()默认情况下,methods 会向响应发送 HTTP 405“Method Not Allowed”错误。您可以自由实现一个或任何一个。

  • Visitor (可通过两种不同的抽象/接口(interface)类型识别,这些类型定义了相互采用其他抽象/接口(interface)类型的方法;一个实际调用另一个的方法,另一个在其上执行所需的策略)
  • 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
  • 关于oop - Java 核心库中的 GoF 设计模式示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1673841/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com