Java核心库中的GoF设计模式示例
oop - Java核心库中GoF设计模式的示例 - 堆栈溢出 (stackoverflow.com)
+250
您可以在维基百科中找到许多设计模式的概述。它还提到了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() (unsynced)java.lang.StringBuffer#append() (synced)java.nio.ByteBuffer#put() (也在CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer和DoubleBuffer)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.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(可通过创建方法识别,该方法采用不同抽象/接口类型的实例并返回自己的抽象/接口类型的实现,该实现委托/使用给定实例)
- 还没有想到。一个虚构的例子是返回一个不可修改的链接映射,该映射不会克隆项目,而是使用它们。然而,
java.util.Collections#newSetFromMap() 和singletonXXX()方法很接近。new LinkedHashMap(LinkedHashSet<K>, List<V>)
复合(可通过行为方法识别,将相同抽象/接口类型的实例转换为树结构)
java.awt.Container#add(Component) (因此几乎遍布 Swing)javax.faces.component.UIComponent#getChildren() (因此几乎遍布JSF UI)
装饰器(可通过采用相同抽象/接口类型的实例的创建方法识别,从而添加额外的行为)
java.io.InputStream、OutputStream、Reader和Writer的所有子类都有一个构造函数,采用相同类型的实例。java.util.Collections, checkedXXX(), syncdXXX() 和unmodifiableXXX()方法。javax.servlet.http.HttpServletRequestWrapper和HttpServletResponseWrapperjavax.swing.JScrollPane
立面(可通过内部使用不同独立抽象/接口类型实例的行为方法识别)
javax.faces.context.FacesContext,它在内部使用抽象/接口类型LifeCycle,ViewHandler,NavigationHandler等等,最终用户不必担心它(但是可以通过注入覆盖)。javax.faces.context.ExternalContext,内部使用 ServletContext、HttpSession、HttpServletRequest、HttpServletResponse等。
蝇量级(可通过返回缓存实例的创建方法识别,有点“多吨”的想法)
代理(可通过返回给定抽象/接口类型的实现的创建方法识别,而创建方法又委托/使用给定抽象/接口类型的不同实现)
java.lang.reflect.Proxyjava.rmi.*javax.ejb.EJB(解释在这里)javax.inject.Inject(解释在这里)javax.persistence.PersistenceContext
行为模式
责任链(可通过行为方法识别,该行为方法(间接)在队列中具有相同抽象/接口类型的另一个实现中调用相同的方法)
命令(可通过抽象/接口类型中的行为方法识别,该行为方法调用不同抽象/接口类型的实现中的方法,该抽象/接口类型在创建过程中已由命令实现封装)
java.lang.Runnable的所有实现javax.swing.Action的所有实现
解释器(可通过返回给定实例/类型的结构不同的实例/类型的行为方法识别;请注意,解析/格式化不是模式的一部分,确定模式以及如何应用它是)
迭代器(可通过从队列中按顺序返回不同类型的实例的行为方法识别)
- java.util.Iterator的所有实现(因此还包括
java.util.Scanner!)。 java.util.Enumeration的所有实现
中介器(可通过采用不同抽象/接口类型(通常使用命令模式)的实例的行为方法识别,该实例委托/使用给定实例)
java.util.Timer(所有方法)scheduleXXX()java.util.concurrent.Executor#execute()java.util.concurrent.ExecutorService(the and methods)invokeXXX()submit()java.util.concurrent.ScheduledExecutorService(all methods)scheduleXXX()java.lang.reflect.Method#invoke()
Memento(可通过内部更改整个实例状态的行为方法识别)
java.util.Date(setter 方法这样做,在内部由一个值表示)Datelongjava.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(), 由 others 执行。Collections#sort()javax.servlet.http.HttpServlet,和所有方法都采用并且实现者必须处理它们(而不是将它们作为实例变量!)。service()doXXX()HttpServletRequestHttpServletResponsejavax.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,默认情况下,所有方法都会向响应发送HTTP 405“方法不允许”错误。您可以自由地不实施它们中的任何一个。doXXX()
访客(可通过两种不同的抽象/接口类型识别,它们定义了将彼此抽象/接口类型采用的方法;一个实际上调用另一个的方法,另一个在其上执行所需的策略)
摘抄自网络,便于检索查找。

浙公网安备 33010602011771号