在Java 核心类库中关于GOF设计模式的例子

2024-03-13 03:58

本文主要是介绍在Java 核心类库中关于GOF设计模式的例子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文地址:http://blog.csdn.net/jiangkai528/article/details/45195915

在Java 核心类库中关于GOF设计模式的例子

问题:   我正在学习GOF的java 设计模式,我想找一些它们中鲜活的例子,在java 核心类库中有哪些好的例子呢?

回答:你可以在维基百科上获得许多设计模式概述。同时也会提到哪些是由GOF提出的。在这里我总结一下,我尽可能多的从java SE 和java EE 的 API 中选取一些设计模式的实现

1.抽象工厂模式 (abstract factory)

  • javax.xml.parsers.DocumentBuilderFactory#newInstance()
  • javax.xml.transform.TransformerFactory#newInstance()
  • javax.xml.xpath.XPathFactory#newInstance()
2.生成器模式(builder)

  • java.lang.StringBuilder#append() (不同步,线程不安全)
  • java.lang.StringBuffer#append() (同步的,线程安全)
  • java.nio.ByteBuffer#put() (同时还有CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBufferand DoubleBuffer)
  • javax.swing.GroupLayout.Group#addComponent()
  •  java.lang.Appendable 的所有实现类
3. 工厂方法模式(factory method)

  • java.util.Calendar#getInstance()
  • java.util.ResourceBundle#getBundle()
  • java.text.NumberFormat#getInstance()
  • java.nio.charset.Charset#forName()
  • java.net.URLStreamHandlerFactory#createURLStreamHandler(String) (每次协议返回单个对象)
4. 原型模式(prototype)

  • java.lang.Object#clone() (这个类必须实现 java.lang.Cloneable  接口)
5.单例模式 (singleton)

  • java.lang.Runtime#getRuntime()
  • java.awt.Desktop#getDesktop()
6.适配器模式(adapter)

  • java.util.Arrays#asList()
  • java.io.InputStreamReader(InputStream) (returns aReader)
  • java.io.OutputStreamWriter(OutputStream) (returns aWriter)
  • javax.xml.bind.annotation.adapters.XmlAdapter#marshal() and#unmarshal()
7. 桥接模式(bridge)

None comes to mind yet. A fictive example would be new LinkedHashMap(LinkedHashSet<K>, List<V>) which returns an unmodifiable linked map which doesn't clone the items, butuses them. Thejava.util.Collections#newSetFromMap() and singletonXXX() methods however comes close.

8.组合模式(composite)

  • java.awt.Container#add(Component) (practically all over Swing thus)
  • javax.faces.component.UIComponent#getChildren() (practically all over JSF UI thus)
9.装饰模式(decorator)

  • All subclasses of java.io.InputStreamOutputStreamReader and Writer have a constructor taking an instance of same type.
  • java.util.Collections, thecheckedXXX(),synchronizedXXX() and unmodifiableXXX() methods.
  • javax.servlet.http.HttpServletRequestWrapper andHttpServletResponseWrapper

10.外观模式(facade)

  • javax.faces.context.FacesContext, it internally uses among others the abstract/interface typesLifeCycle,ViewHandler,NavigationHandler and many more without that the enduser has to worry about it (which are however overrideable by injection).
  • javax.faces.context.ExternalContext, which internally usesServletContext,HttpSession,HttpServletRequest,HttpServletResponse, etc.
11.享元模式(flyweight)

java.lang.Integer#valueOf(int) (同时还有Boolean,Byte,Character,Short and Long)


12.代理模式(proxy)

  • java.lang.reflect.Proxy
  • java.rmi.*, 整个API
13. 职责链模式(chain of responsibility)

  • java.util.logging.Logger#log()
  • javax.servlet.Filter#doFilter()
14. 命令模式(command)

  • All implementations of java.lang.Runnable
  • All implementations of javax.swing.Action

15. 解析器模式(interpreter)

  • java.util.Pattern
  • java.text.Normalizer
  • All subclasses of java.text.Format
  • All subclasses of javax.el.ELResolver

16. 迭代器模式 (iterator)

  • All implementations of java.util.Iterator (thus among others also java.util.Scanner!).
  • All implementations of java.util.Enumeration
17. 中介者模式 (mediator)

  • java.util.Timer (allscheduleXXX() methods)
  • java.util.concurrent.Executor#execute()
  • java.util.concurrent.ExecutorService (theinvokeXXX() andsubmit() methods)
  • java.util.concurrent.ScheduledExecutorService (allscheduleXXX() methods)
  • java.lang.reflect.Method#invoke()

18.备忘录模式(memento)

  • java.util.Date (the setter methods do that,Date is internally represented by along value)
  • All implementations of java.io.Serializable
  • All implementations of javax.faces.component.StateHolder
19. 观察者模式(observer)

  • java.util.Observer/java.util.Observable (rarely used in real world though)
  • All implementations of java.util.EventListener (practically all over Swing thus)
  • javax.servlet.http.HttpSessionBindingListener
  • javax.servlet.http.HttpSessionAttributeListener
  • javax.faces.event.PhaseListener
20.状态模式(state)

javax.faces.lifecycle.LifeCycle#execute()

(controlled by FacesServlet, the behaviour is dependent on current phase (state) of JSF lifecycle)


21.策略模式(strategy)

  • java.util.Comparator#compare(), executed by among othersCollections#sort().
  • javax.servlet.http.HttpServlet, theservice() and alldoXXX() methods takeHttpServletRequestandHttpServletResponse and the implementor has to process them (and not to get hold of them as instance variables!).
  • javax.servlet.Filter#doFilter()

22. 模板方法模式(template method)

  • All non-abstract methods of java.io.InputStreamjava.io.OutputStreamjava.io.Reader and java.io.Writer.
  • All non-abstract methods of java.util.AbstractListjava.util.AbstractSet and java.util.AbstractMap.
  • javax.servlet.http.HttpServlet, all thedoXXX() methods by default sends a HTTP 405 "Method Not Allowed" error to the response. You're free to implement none or any of them.
23. 访问者模式(visitor)

  • javax.lang.model.element.AnnotationValue andAnnotationValueVisitor
  • javax.lang.model.element.Element andElementVisitor
  • javax.lang.model.type.TypeMirror andTypeVisitor


这篇关于在Java 核心类库中关于GOF设计模式的例子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/803576

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有