原帖:http://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns

提问:我正在学习GoF的《设计模式》,想了解些它们在实际中的应用的样例。

大家能给我举一些使用设计模式的好样例吗?尤其是在Java类库中。

获得赞同最高的回答:

你能够通过Wikipedia对设计模式有个总体上的理解。Wikipedia上也提高了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.lang.Appendable的全部实现

工厂方法模式

特点:创建方法返回抽象类或接口的实现。

  • java.util.Calendar#getInstance()
  • java.util.ResourceBundle#getBundle()
  • java.text.NumberFormat#getInstance()
  • java.nio.charset.Charset#forName()
  • java.net.URLStreamHandlerFactory#createURLStreamHandler(String)对于每一个协议(protocol)返回一个单例对象

原型模式

特点:创建方法返回一个同类型且具有同样属性的还有一个实例。

  • java.lang.Object#clone()(这个类必须实现java.lang.Cloneable)

单例模式

特点:创建方法返回同一个实例(不管在何时调用)。

  • java.lang.Runtime#getRuntime()
  • java.awt.Desktop#getDesktop()

结构型模式

适配器模式

特点:创建方法接受一个与当前类不同的抽象类或接口的实例作为參数,返回一个经过修饰或重写给定參数实例的抽象类或接口的实现。

  • java.util.Arrays#asList()
  • java.io.InputStreamReader(InputStream)返回一个Reader对象
  • java.io.OutputStreamWriter(OutputStream)返回一个Writer对象
  • javax.xml.bind.annotation.adapters.XmlAdapter#marshal()与#unmarshal()

桥接模式

特点:创建方法接受一个与当前类不同的抽象类或接口的实例作为參数,返回一个经过代理或使用给定參数实例的抽象类或接口的实现。

  • 临时没有想到。一个能够想到的样例是new LinkedHashMap(LinkedHashSet, List)。这种方法返回一个不可改动的linkedMap。它就没有拷贝參数中的元素(item),而是直接使用它们。java.util.Collections#newSetFromMap()和singletonXXX()方法也与之类似。

组合模式

特点:行为方法把同样抽象类或接口的实例转化为一个树结构。

  • java.awt.Container#add(Component)(差点儿对全部的Swing都适用)
  • javax.faces.component.UIComponent#getChildren()(差点儿对全部的JSF UI都适用)

装饰模式

特点:创建方法以一个抽象类或接口的实例为參数。返回值是添加了额外方法的给參数实例。

  • java.io.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.*包下的全部类

恕我直言,Wikipedia上的类子不是非常好,惰性载入实际上和代理模式一点关系也没有。

行为模式

职责链模式

特点:行为方法间接调用队列中同一抽象类或接口的还有一实例的同名方法。

  • 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(setter方法就是典型的样例,Date对象在内容是用一个long值来表示的)
  • java.io.Serializable的全部实现
  • javax.faces.component.StateHolder的全部实现

观察者(公布/订阅)模式

特点:行为方法依据其自身的状态,去调用还有一个抽象类或接口实例的方法。

  • java.util.Observer/java.util.Observable在实际中用的比較少
  • java.util.EventListener的全部实现(差点儿对所以Swing对象都适用)
  • javax.servlet.http.HttpSessionBindingListener
  • http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSessionAttributeListener.html
  • javax.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()方法默认发送HTTP 405“方法不同意”这个错误给response,你能够自由地选择是否去实现它们

訪问者模式

特点:由两个不同的抽象类或接口,它们都有接受对方做參数的方法,被调用的方法会去调用还有一个对象的方法,然后依据制定好的策略运行。

  • javax.lang.model.element.AnnotationValue与AnnotationValueVisitor
  • javax.lang.model.element.Element与ElementVisitor
  • javax.lang.model.type.TypeMirror与TypeVisitor

參考翻译:

http://www.importnew.com/12526.html

转载于:https://www.cnblogs.com/yutingliuyl/p/6777262.html

java类库中的设计模式相关推荐

  1. 多线程编程进阶——Java类库中的锁

    在Java多线程中,可以使用synchronized关键字来实现线程之间同步互斥,在JDK1.5以后,Java类库中新增了Lock接口用来实现类似的锁功能.下面会逐一介绍关于Java类库中所提供的锁功 ...

  2. [召集] .NET Framework基本类库中的设计模式

    活动背景 现在研究设计模式的人很多,研究.NET设计模式的也不在少数.但大家的研究都是靠自己YY一个应用场景,然后写一些"样例"代码实现之.这离实际应用太遥远了. Anders L ...

  3. dalvik Java类库中本地类

    dalvik中Java类库有许多本地类(全本地方法) 当(Java/C++)调用(Java类库中)本地类的本地方法时,ResolveNativeMethod:查映射表-->本地类的本地函数集-- ...

  4. java栈顶元素_栈在Java类库中的实现

    栈是一种后进先出的数据结构.在它之上,主要有三种操作: (1)判断栈是否为空--empty(): (2)在栈顶添加一个元素--push(E): (3)删除并返回栈顶元素--pop(). 在Java类库 ...

  5. java 栈的输出顺序,栈在Java类库中的顺序表示及实现——Stack

    栈是一种后进先出的数据结构.在它之上,主要有三种操作: (1)判断栈是否为空--empty(): (2)在栈顶添加一个元素--push(E): (3)删除并返回栈顶元素--pop(). 在Java类库 ...

  6. java api中的设计模式_Java API 设计模式之策略(Strategy)

    策略设计模式与状态设计模式相类似.我们提到过,状态设计模式包含一个状态对象,该对象封装一个上下文对象的状态.策略设计模式包含一个策略对象.该对象与状态设计模式的状态对象相类似.它们之间的关键不同在于: ...

  7. Java 并发编程解析 | 如何正确理解Java领域中的多线程模型,主要用来解决什么问题?

    苍穹之边,浩瀚之挚,眰恦之美: 悟心悟性,善始善终,惟善惟道! -- 朝槿<朝槿兮年说> 写在开头 我国宋代禅宗大师青原行思在<三重境界>中有这样一句话:" 参禅之初 ...

  8. java sql封装,在Java系统中封装SQL语言的处理方法及系统的制作方法

    在Java系统中封装SQL语言的处理方法及系统的制作方法[ 技术领域: ][0001]本发明涉及计算机数据处理 技术领域: ,特别是涉及一种在Java系统中封装SQL语言的处理方法及系统.[ 背景技术 ...

  9. 【Java心得总结六】Java容器中——Collection

    在[Java心得总结五]Java容器上--容器初探这篇博文中,我对Java容器类库从一个整体的偏向于宏观的角度初步认识了Java容器类库.而在这篇博文中,我想着重对容器类库中的Collection容器 ...

  10. java util 中set,List 和Map的使用

    Set对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于Set,而不关心它的顺序--否则应该使用List).Map同样对每个元素保存一份,但这是基于"键" ...

最新文章

  1. 漫话:如何给女朋友解释什么是缓存穿透、缓存击穿、缓存雪崩?
  2. golang for android
  3. 对于指针传入函数,却最终没有改变指针的值的问题
  4. wxWidgets:wxAuiTabArt类用法
  5. 设计模式学习笔记九:原型模式(Prototype Pattern)
  6. 【三维激光扫描】实验01:环境搭建CAD2014+StonexSiScan软件安装
  7. [html] Form表单是怎么上传文件的?你了解它的原理吗?
  8. pdo mysql下载,yum安装mysql5.7 和 pdo_mysql扩展
  9. js判断是否以xxx结尾
  10. 架构师需要了解的知识
  11. AutoMapper学习笔记
  12. hadoop学习一-hadoop简介
  13. perl脚本 linux,linux – 通过Perl脚本设置环境变量
  14. ASP编程实现各家快递公司订单状态查询
  15. MODIS数据下载及批处理
  16. lol一直显示服务器满,LOL服务器爆满!排队两个小时你敢信?网友感慨原来大家都在啊...
  17. 软件开发实训(720科技)――第五课:前端css规范
  18. Index Notation
  19. Entrepreneur\'s Credo of the American 美国的企业家宣言
  20. 《Python自然语言处理》——1.1 语言计算:文本和词汇

热门文章

  1. MongoDB整理笔记のGUI操作
  2. Hive内部表外部表转化分析(装)
  3. 实战 TPCC-MySQL 基准测试
  4. ArrayList转换类型为DataTable类型
  5. 关于mssql的学习体会,仅供参考!
  6. Windows 7 SP1意味着XP降级的结束
  7. mysql 5.5 innodb 优化_mysql 5.5 -- innodb buffer pool优化
  8. Linux音频驱动-Card创建
  9. Linux设备驱动之字符设备(二)
  10. 桃李春风一杯酒,江湖夜雨十年灯 - 老兵夜话DPDK