【Java】GoF-23种设计模式在Java核心类库中的应用
文章目录
- Creational patterns(创建型模式)
- Abstract factory(抽象工厂模式)
- Builder(建造者模式)
- Factory method(工厂模式)
- Prototype(原型模式)
- Singleton(单例模式)
- Structural patterns(结构型模式)
- Adapter(适配器模式)
- Bridge(桥接模式)
- Composite(组合模式)
- Decorator(装饰器模式)
- Facade(外观模式)
- Flyweight(享元模式)
- Proxy(代理模式)
- Behavioral patterns(行为型模式)
- Chain of responsibility(责任链模式)
- Command(命令模式)
- Interpreter(解释器模式)
- Iterator(迭代器模式)
- Mediator(中介者模式)
- Memento(备忘录模式)
- Observer(or Publish/Subscribe)(观察者模式)
- State(状态模式)
- Strategy(策略模式)
- Template method(模板模式)
- Visitor (访问者模式)
- 转载说明
Creational patterns(创建型模式)
Abstract factory(抽象工厂模式)
recognizeable by creational methods returning the factory itself which in turn can be used to create another abstract/interface type.
- javax.xml.parsers.DocumentBuilderFactory#newInstance()
- javax.xml.transform.TransformerFactory#newInstance()
- javax.xml.xpath.XPathFactory#newInstance()
Builder(建造者模式)
recognizeable by creational methods returning the instance itself.
- java.lang.StringBuilder#append() (unsynchronized)
- java.lang.StringBuffer#append() (synchronized)
- java.nio.ByteBuffer#put() (also on CharBuffer, ShortBuffer, IntBuffer, LongBuffer, FloatBuffer and DoubleBuffer)
- javax.swing.GroupLayout.Group#addComponent()
- All implementations of java.lang.Appendable
- java.util.stream.Stream.Builder
Factory method(工厂模式)
recognizeable by creational methods returning an implementation of an abstract/interface type.
- java.util.Calendar#getInstance()
- java.util.ResourceBundle#getBundle()
- java.text.NumberFormat#getInstance()
- java.nio.charset.Charset#forName()
- java.net.URLStreamHandlerFactory#createURLStreamHandler(String) (Returns singleton object per protocol)
- java.util.EnumSet#of()
- javax.xml.bind.JAXBContext#createMarshaller() and other similar methods
Prototype(原型模式)
recognizeable by creational methods returning a different instance of itself with the same properties.
- java.lang.Object#clone() (the class has to implement java.lang.Cloneable)
Singleton(单例模式)
recognizeable by creational methods returning the same instance (usually of itself) everytime.
- java.lang.Runtime#getRuntime()
- java.awt.Desktop#getDesktop()
- java.lang.System#getSecurityManager()
Structural patterns(结构型模式)
Adapter(适配器模式)
recognizeable by creational methods taking an instance of different abstract/interface type and returning an implementation of own/another abstract/interface type which decorates/overrides the given instance.
- java.util.Arrays#asList()
- java.util.Collections#list()
- java.util.Collections#enumeration()
- java.io.InputStreamReader(InputStream) (returns a Reader)
- java.io.OutputStreamWriter(OutputStream) (returns a Writer)
- javax.xml.bind.annotation.adapters.XmlAdapter#marshal() and #unmarshal()
Bridge(桥接模式)
recognizeable by creational methods taking an instance of different abstract/interface type and returning an implementation of own abstract/interface type which delegates/uses the given instance.
- None comes to mind yet. A fictive example would be new LinkedHashMap(LinkedHashSet, List) which returns an unmodifiable linked map which doesn’t clone the items, but uses them. The java.util.Collections#newSetFromMap() and singletonXXX() methods however comes close.
Composite(组合模式)
recognizeable by behavioral methods taking an instance of same abstract/interface type into a tree structure.
- java.awt.Container#add(Component) (practically all over Swing thus)
- javax.faces.component.UIComponent#getChildren() (practically all over JSF UI thus)
Decorator(装饰器模式)
recognizeable by creational methods taking an instance of same abstract/interface type which adds additional behaviour.
- All subclasses of java.io.InputStream, OutputStream, Reader and Writer have a constructor taking an instance of same type.
- java.util.Collections, the checkedXXX(), synchronizedXXX() and unmodifiableXXX() methods.
- javax.servlet.http.HttpServletRequestWrapper and HttpServletResponseWrapper
- javax.swing.JScrollPane
Facade(外观模式)
recognizeable by behavioral methods which internally uses instances of different independent abstract/interface types.
- javax.faces.context.FacesContext, it internally uses among others the abstract/interface types LifeCycle, 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 uses ServletContext, HttpSession, HttpServletRequest, HttpServletResponse, etc.
Flyweight(享元模式)
recognizeable by creational methods returning a cached instance, a bit the “multiton” idea.
- java.lang.Integer#valueOf(int) (also on Boolean, Byte, Character, Short, Long and BigDecimal)
Proxy(代理模式)
recognizeable by creational methods which returns an implementation of given abstract/interface type which in turn delegates/uses a different implementation of given abstract/interface type.
- java.lang.reflect.Proxy
- java.rmi.*
- javax.ejb.EJB (explanation here)
- javax.inject.Inject (explanation here)
- javax.persistence.PersistenceContext
Behavioral patterns(行为型模式)
Chain of responsibility(责任链模式)
recognizeable by behavioral methods which (indirectly) invokes the same method in another implementation of same abstract/interface type in a queue.
- java.util.logging.Logger#log()
- javax.servlet.Filter#doFilter()
Command(命令模式)
recognizeable by behavioral methods in an abstract/interface type which invokes a method in an implementation of a different abstract/interface type which has been encapsulated by the command implementation during its creation.
- All implementations of java.lang.Runnable
- All implementations of javax.swing.Action
Interpreter(解释器模式)
recognizeable by behavioral methods returning a structurally different instance/type of the given instance/type; note that parsing/formatting is not part of the pattern, determining the pattern and how to apply it is.
- java.util.Pattern
- java.text.Normalizer
- All subclasses of java.text.Format
- All subclasses of javax.el.ELResolver
Iterator(迭代器模式)
recognizeable by behavioral methods sequentially returning instances of a different type from a queue.
- All implementations of java.util.Iterator (thus among others also java.util.Scanner!).
- All implementations of java.util.Enumeration
Mediator(中介者模式)
recognizeable by behavioral methods taking an instance of different abstract/interface type (usually using the command pattern) which delegates/uses the given instance.
- java.util.Timer (all scheduleXXX() methods)
- java.util.concurrent.Executor#execute()
- java.util.concurrent.ExecutorService (the invokeXXX() and submit() methods)
- java.util.concurrent.ScheduledExecutorService (all scheduleXXX() methods)
- java.lang.reflect.Method#invoke()
Memento(备忘录模式)
recognizeable by behavioral methods which internally changes the state of the whole instance.
- java.util.Date (the setter methods do that, Date is internally represented by a long value)
- All implementations of java.io.Serializable
- All implementations of javax.faces.component.StateHolder
Observer(or Publish/Subscribe)(观察者模式)
recognizeable by behavioral methods which invokes a method on an instance of another abstract/interface type, depending on own state.
- 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
State(状态模式)
recognizeable by behavioral methods which changes its behaviour depending on the instance’s state which can be controlled externally.
- javax.faces.lifecycle.LifeCycle#execute() (controlled by FacesServlet, the behaviour is dependent on current phase (state) of JSF lifecycle)
Strategy(策略模式)
recognizeable by behavioral methods in an abstract/interface type which invokes a method in an implementation of a different abstract/interface type which has been passed-in as method argument into the strategy implementation.
- java.util.Comparator#compare(), executed by among others Collections#sort().
- javax.servlet.http.HttpServlet, the service() and all doXXX() methods take HttpServletRequest and HttpServletResponse and the implementor has to process them (and not to get hold of them as instance variables!).
- javax.servlet.Filter#doFilter()
Template method(模板模式)
recognizeable by behavioral methods which already have a “default” behaviour defined by an abstract type.
- All non-abstract methods of java.io.InputStream, java.io.OutputStream, java.io.Reader and java.io.Writer.
- All non-abstract methods of java.util.AbstractList, java.util.AbstractSet and java.util.AbstractMap.
- javax.servlet.http.HttpServlet, all the doXXX() methods by default sends a HTTP 405 “Method Not Allowed” error to the response. You’re free to implement none or any of them.
Visitor (访问者模式)
recognizeable by two different abstract/interface types which has methods defined which takes each the other abstract/interface type; the one actually calls the method of the other and the other executes the desired strategy on it.
- javax.lang.model.element.AnnotationValue and AnnotationValueVisitor
- javax.lang.model.element.Element and ElementVisitor
- javax.lang.model.type.TypeMirror and TypeVisitor
- java.nio.file.FileVisitor and SimpleFileVisitor
- javax.faces.component.visit.VisitContext and VisitCallback
转载说明
用途:学习、分享
原文:原文链接
【Java】GoF-23种设计模式在Java核心类库中的应用相关推荐
- 经典:从追MM谈Java的23种设计模式
2019独角兽企业重金招聘Python工程师标准>>> 从追MM谈Java的23种设计模式1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然 ...
- 从追MM谈Java的23种设计模式
设计模式做为程序员的"内功心法",越来越受到.net 社区的重视,这种变化是很可喜的,Java社区走在了我们的前面,但这种状况 也许有一天会发生改变. {虽然有点长,但是相信相当经 ...
- Java进阶 23种设计模式 详解+应用+实例代码
文章目录 前言 设计模式六大原则 1.单一原则 (1) 概念 (2) 优点 2.开闭原则 (1) 概念 3.里氏替换原则 (1) 概念 4.依赖倒置原则 (1) 概念 (2) 作用 5.接口隔离原则 ...
- java 的23种设计模式 之单身狗和隔壁老王的故事
2019独角兽企业重金招聘Python工程师标准>>> 觉得代码写的别扭了,回头翻翻java 的23种设计模式. today,额,这么晚了,困了.就弄个最简单的单例模式吧. 单例模式 ...
- 追MM“23式”—— GOF 23种设计模式
追MM"23式" -- GOF 23种设计模式 创建型模式 1.FACTORY 2.BUILDER 3.FACTORY METHOD 4.PROTOTYPE 5.SINGLETON ...
- java与23种设计模式
1 23种设计模式分类 经典的<设计模式>一书归纳出23种设计模式,本文按<易学设计模式>一书归纳分类如下: 1.创建型模式 前面讲过,社会化的分工越来越细,自然在软件设计方面 ...
- java 的23种设计模式 单例模式
23种设计模式友情链接: 点击打开链接 单例模式: A.饿汉式单例模式 具体步骤: 1.声明一个私有的静态的最终的本类类型的对象并实例化 private static final Person ins ...
- Java的23种设计模式详解
创建型模式 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说"来四个鸡翅"就 ...
- 关于Java的23种设计模式的有趣见解
2019独角兽企业重金招聘Python工程师标准>>> 在网上看见了这篇文章,作者以轻松的语言比喻了java的32种模式,有很好的启发作用. 好东西不得不转 创建型模式 1.FACT ...
- (转)java关于23种java关于23种设计模式的有趣见解 设计模式的有趣见解
创建型模式 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说"来四个鸡翅"就 ...
最新文章
- 组合计数 ---- 2020 EC final B. Rectangle Flip 2(枚举+组合计数)
- ASM 磁盘、目录的管理
- php oracle count,调用Count列php mysql
- mybatis注解详解
- 局域网读取文件_教你windows局域网如何设置共享文件
- day10:函数进阶
- 应用程序进程启动过程
- asyncdata 获取参数_nuxt的asyncData发送post请求如何传递FormData形式的参数
- React Elements vs React Components
- js生成的字符串php,js生成任意长度随机字符串
- 转载:手把手教你把Vim改装成一个IDE编程环境(图文)
- paip.c++ 宏的展开调试.
- 关于java小游戏的暂停,退出和从新开始
- 科学计算机计算内插法,线性插值计算器
- 计算机只能在安全模式下起动,电脑不能进入正常的XP系统,只能在安全模式下启动?...
- 菜鸟笔记--函数基础
- 马克思主义与社会科学方法论
- 启发国内学子学习少儿机器人编程教育
- 揭秘英雄联盟的数据服务器
- openSUSE桌面环境日常软件推荐
热门文章
- [Luogu 2486] SDOI2011 染色
- 玩下软工项目,第一轮--全局Context的获取,SQLite的建立与增删改查,读取用户通话记录信息...
- Eclipse手动配置svn
- OpenGl绘制螺旋线
- 算法导论-用于不相交集合的数据结构
- Think in Java之斐波那契数列
- python3 生成器
- java 中break如何跳出多层循环(包含二层循环)
- java综合案例_综合实例 - Java House - BlogJava
- 未来教育计算机二级预测c,二级C语言(附光盘)(全国计算机等级考试预测试卷与真考题库)...