java类库中的设计模式
原帖: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.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等。
享元模式
特点:创建方法返回一个缓存的实例。与多例模式有些类似。
代理模式
特点:创建方法返回一个给定抽象类或接口的实例,这个实例代理或使用了这个给定抽象类或接口的还有一个实现。
恕我直言,Wikipedia上的类子不是非常好,惰性载入实际上和代理模式一点关系也没有。
行为模式
职责链模式
特点:行为方法间接调用队列中同一抽象类或接口的还有一实例的同名方法。
命令模式
特点:一个抽象类或接口中的行为方法调用还有一个在创建时经命令方法包装的抽象类或接口实现的还有一个方法。
- 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的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
java类库中的设计模式的更多相关文章
- 谈谈Java常用类库中的设计模式 - Part Ⅰ
背景 最近一口气看完了Joshua Bloch大神的Effective Java(下文简称EJ).书中以tips的形式罗列了Java开发中的最佳实践,每个tip都将其意图和要点压缩在了标题里,这种做法 ...
- JAVA IO中的设计模式
在java语言 I/O库的设计中,使用了两个结构模式,即装饰模式和适配器模式. 在任何一种计算机语言中,输入/输出都是一个很重要的部分.与一般的计算机语言相比,java将输入/输出的功能和 ...
- 谈谈Java常用类库中的设计模式 - Part Ⅱ
概述 本系列上一篇:建造者.工厂方法.享元.桥接 本文介绍的设计模式(建议按顺序阅读): 适配器 模板方法 装饰器 相关缩写:EJ - Effective Java Here We Go 适配器 (A ...
- java开发中的设计模式
http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html 一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五 ...
- Java Web中MVC设计模式与IOC
MVC是由Model(模型).View(视图).Controller(控制器)三个模块组成 视图:用于做数据展示以及和用户交互的一个界面(html页面) 控制层:能够接受客户端的请求,具体的业务功能还 ...
- 【Java心得总结六】Java容器中——Collection
在[Java心得总结五]Java容器上——容器初探这篇博文中,我对Java容器类库从一个整体的偏向于宏观的角度初步认识了Java容器类库.而在这篇博文中,我想着重对容器类库中的Collection容器 ...
- JAVA项目中常用的异常处理情况总结
JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...
- java类库字符串操作
在java类库中,java给我们提供了字符串几个特别的操作,分别是String,Stringbuffer,Stringbuilder等.下面就对这几个类做一个简单的介绍.首先,我们先了解一下Strin ...
- JAVA项目中常用的异常知识点总结
JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...
随机推荐
- JavaScript内存分配
1.栈内存和堆内存 栈内存为自动分配的内存空间,由系统自动释放堆内存是动态分配的内存,大小不固定,也不会自动释放 js的值类型直接分配在栈内存中,引用类型分配在堆内存中引用类型变量保存的是引用类型的指 ...
- String.intern() (jdk1.8)
1.通过字面量赋值创建字符串 (如:String str=”aaa”)时,会先在常量池中查找是否存在相同的字符串,若存在,则将栈中的引用直接指向该字符串:若不存在,则在常量池中生成一个字符串,再将栈中 ...
- python3的cookielib
http://stackoverflow.com/questions/8405096/python-3-2-cookielib
- golang深坑记录
go深坑:1.gin.context.JSON,如果没有make数组时,数组返回为null,make后,数组为[]2.json.Number转int64类型 datatemp.(json.Number ...
- vue项目中使用iconMoon图标
前两篇文章写了一下如何在vue项目中使用vue-awesome和阿里的iconfont,这里介绍一下如何使用iconMoon图标 iconMoon和前两者相比可以生成自己的矢量图,这点是我喜欢的.至于 ...
- 地精部落(bzoj 1925)
Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi, ...
- numeric 转换为数据类型 (null) 时出现算术溢出错误
mssql数据同步到mysql时提示错误如下: 消息 8115,级别 16,状态 14,第 1 行 将 numeric 转换为数据类型 (null) 时出现算术溢出错误 问题分析如下: 1.数据字段类 ...
- 转一个网址,canvas用法
http://blog.csdn.net/jia20003/article/details/9251893 http://www.w3school.com.cn/cssref/pr_animation ...
- 关于Struts2中param的作用
1.页面传参与配置传参的区别: 如果页面Form表单的参数在Action类中有相应的setter方法,则会优先取页面Form表单传过来的值,如果页面没有该属性同名的参数,则会从配置文件中取同名的参数值 ...
- 移动端web如何让页面强制横屏
前段时间公司针对直播服务做了改版升级,APP客户端支持了横屏和竖屏推流/播放. 在这个背景下,虽然触屏未做改动,但本着敏而好学,不断探索的精神,针对如何让web页面强制横屏显示,做了一下试验研究. 首 ...