JDK中有关23个经典设计模式的示例
Creational patterns
Abstract factory (recognizeable by creational methods returning an abstract/interface type)
java.util.Calendar#getInstance()java.util.Arrays#asList()java.util.ResourceBundle#getBundle()java.net.URL#openConnection()java.sql.DriverManager#getConnection()java.sql.Connection#createStatement()java.sql.Statement#executeQuery()java.text.NumberFormat#getInstance()java.lang.management.ManagementFactory(allgetXXX()methods)java.nio.charset.Charset#forName()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 onCharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBufferandDoubleBuffer)javax.swing.GroupLayout.Group#addComponent()- All implementations of
java.lang.Appendable
Factory method (recognizeable by creational methods returning a concrete type)
java.lang.Object#toString()(overrideable in all subclasses)java.lang.Class#newInstance()java.lang.Integer#valueOf(String)(also onBoolean,Byte,Character,Short,Long,FloatandDouble)java.lang.Class#forName()java.lang.reflect.Array#newInstance()java.lang.reflect.Constructor#newInstance()
Prototype (recognizeable by creational methods returning a different instance of itself with the same properties)
java.lang.Object#clone()(the class has to implementjava.lang.Cloneable)
Singleton (recognizeable by creational methods returning the same instance (usually of itself) everytime)
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.io.InputStreamReader(InputStream)(returns aReader)java.io.OutputStreamWriter(OutputStream)(returns aWriter)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<K>, List<V>)which returns an unmodifiable linked map which doesn't clone the items, but uses them. Thejava.util.Collections#newSetFromMap()andsingletonXXX()methods however comes close.
Composite (recognizeable by behavioral methods taking an instance of same abstract/interface type)
java.util.Map#putAll(Map)java.util.List#addAll(Collection)java.util.Set#addAll(Collection)java.nio.ByteBuffer#put(ByteBuffer)(also onCharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBufferandDoubleBuffer)java.awt.Container#add(Component)(practically all over Swing thus)
Decorator (recognizeable by creational methods taking an instance of same abstract/interface type)
- All subclasses of
java.io.InputStream,OutputStream,ReaderandWriterhave a constructor taking an instance of same type. - Almost all implementations of
java.util.List,SetandMaphave a constructor taking an instance of same type. java.util.Collections, thecheckedXXX(),synchronizedXXX()andunmodifiableXXX()methods.javax.servlet.http.HttpServletRequestWrapperandHttpServletResponseWrapper
Facade (recognizeable by behavioral methods which internally uses instances of different independent abstract/interface types)
javax.faces.webapp.FacesServlet, it internally uses among others the abstract/interface typesServletContext,LifeCycle,ViewHandler,NavigationHandlerand many more without that the enduser has to worry about it (which are however overrideable by injection).
Flyweight (recognizeable by creational methods returning a cached instance, a bit the "multiton" idea)
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.Proxyjava.rmi.*, the whole API actually.
The Wikipedia example is IMHO a bit poor, lazy loading has actually completely nothing to do with the proxy pattern at all.
Behavioral patterns
Chain of responsibility (recognizeable by behavioral methods which (indirectly) invokes the same method inanother implementation of same abstract/interface type in a queue)
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.Patternjava.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 alsojava.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(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()
Memento (recognizeable by behavioral methods which internally changes the state of the whole instance)
java.util.Date(the setter methods do that,Dateis internally represented by alongvalue)- 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.HttpSessionBindingListenerjavax.servlet.http.HttpSessionAttributeListenerjavax.faces.event.PhaseListener
State (recognizeable by behavioral methods which changes its behaviour depending on the instance's state which can be controlled externally)
- All implementations of
java.util.Iterator javax.faces.lifecycle.LifeCycle#execute()(controlled byFacesServlet, 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 othersCollections#sort().javax.servlet.http.HttpServlet, theservice()and alldoXXX()methods takeHttpServletRequestandHttpServletResponseand 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 definied by an abstract type)
- All non-abstract methods of
java.io.InputStream,java.io.OutputStream,java.io.Readerandjava.io.Writer. - All non-abstract methods of
java.util.AbstractList,java.util.AbstractSetandjava.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.
Visitor (recognizeable by two different abstract/interface types which has methods definied which takes each the otherabstract/interface type; the one actually calls the method of the other and the other executes the desired strategy on it)
javax.lang.model.element.AnnotationValueandAnnotationValueVisitorjavax.lang.model.element.ElementandElementVisitorjavax.lang.model.type.TypeMirrorandTypeVisitor
JDK中有关23个经典设计模式的示例的更多相关文章
- GoF的23个经典设计模式
以文本和思维导图的方式简明扼要的介绍了GoF的23个经典设计模式,可当成学习设计模式的一个小手册,偶尔看一下,说不定会对大师的思想精髓有新的领悟. GoF(“四人帮”,又称Gang of Four,即 ...
- 23种经典设计模式UML类图汇总
在这里23种经典设计模式UML类图汇总 创建型模式 1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基 ...
- Java开发中的23+2种设计模式学习个人笔记(未完待续)
注:个人笔记 一.设计模式分三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模 ...
- Java中23种经典设计模式详解
Java中23种设计模式目录1. 设计模式 31.1 创建型模式 41.1.1 工厂方法 41.1.2 抽象工厂 61.1.3 建造者模式 101.1.4 单态模式 131.1.5 原型模式 151. ...
- 在这里23种经典设计模式UML类图汇总
创建型模式 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说"来四个鸡翅"就 ...
- 23个经典JDK设计模式(转)
下面是JDK中有关23个经典设计模式的示例: Structural(结构模式) Adapter: 把一个接口或是类变成另外一种. o ● java.util.Arrays#asList() o ...
- 经典设计模式-iOS的实现
最近看了<HeadFirst 设计模式>这本书,给组内伙伴准备一次分享,把这次分享记录下来,有需要的可以看看. 这本书主要介绍了四人帮23种经典设计模式中的的14种,也是常用的几种.看完这 ...
- 23种JavaScript设计模式
原文链接:https://boostlog.io/@sonuton/23-javascript-design-patterns-5adb006847018500491f3f7f 转自: https:/ ...
- (转载)JDK中的设计模式
写的很好,学习道路更轻松一些 原文地址:http://blog.csdn.net/gtuu0123/article/details/6114197 JDK中设计模式 分类: Java相关 设计模式 2 ...
随机推荐
- iOS 5 ARC 入门
这篇文章还可以在这里找到 英语, 波兰语 Learn the ins and outs of ARC in iOS 5! 这是iOS 5 盛宴中的第12篇教程! 这篇教程是我们的新书 iOS 5 By ...
- C#字符串、字节数组和内存流间的相互转换 - IT浪潮之巅
定义string变量为str,内存流变量为ms,比特数组为bt 1.字符串=>比特数组 (1)byte[] bt=System.Text.Encoding.Default.GetBytes(&q ...
- SQLServer日期格式化及创建相关日期
DECLARE @FirstDay_M DATETIME --本月初日期 ,); DECLARE @LastDay_M DATETIME --本月末日期 SET @LastDay_M = DATEAD ...
- 《DSP using MATLAB》Problem 8.35
代码: %% ------------------------------------------------------------------------ %% Output Info about ...
- 搞笑:我是我们村唯一一个搞IT的!
出自:http://codebay.cn/post/8033.html 当我跟村里人提起我是IT工程师时 他们内心是这样想的 ▼ 也有的朋友这样想 ▼ 爸爸问我,什么狮? ▼ 妈妈问我,工什么? ▼ ...
- wpf 让正执行的程序暂停几秒钟
public static class DispatcherHelper { [SecurityPermissionAttribute(SecurityAction.Deman ...
- ES6和常用特性归纳
ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.Mozilla公司将在这个标准的基础上,推出JavaScript 2.0. ECMAS ...
- mysql主从跳过错误
mysql主从复制,经常会遇到错误而导致slave端复制中断,这个时候一般就需要人工干预,跳过错误才能继续 跳过错误有两种方式: 1.跳过指定数量的事务 mysql>stop slave; m ...
- 杂项-DTO:DTO(数据传输对象)
ylbtech-杂项-DTO:DTO(数据传输对象) 数据传输对象(DTO)(Data Transfer Object),是一种设计模式之间传输数据的软件应用系统.数据传输目标往往是数据访问对象从数据 ...
- PAT甲级——A1075 PAT Judge
The ranklist of PAT is generated from the status list, which shows the scores of the submissions. Th ...