简述JDK里的23个经典设计模式
创始人
2024-07-18 09:41:47
0

本文总结了JDK中有关23个经典设计模式的示例,在stakeoverflow也有相应的讨论:

Adapter:

把一个接口或是类变成另外一种。

  1. java.util.Arrays#asList()  
  2.  
  3. javax.swing.JTable(TableModel)  
  4.  
  5. java.io.InputStreamReader(InputStream)  
  6.  
  7. java.io.OutputStreamWriter(OutputStream)  
  8.  
  9. javax.xml.bind.annotation.adapters.XmlAdapter#marshal()  
  10.  
  11. javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()  
  12.  

Bridge:

把抽象和实现解藕,于是接口和实现可在完全独立开来。

AWT (提供了抽象层映射于实际的操作系统)

JDBC

Composite:

让使用者把单独的对象和组合对象混用。

  1. javax.swing.JComponent#add(Component)  
  2.  
  3. java.awt.Container#add(Component)  
  4.  
  5. java.util.Map#putAll(Map)  
  6.  
  7. java.util.List#addAll(Collection)  
  8.  
  9. java.util.Set#addAll(Collection)  
  10.  

Decorator:

为一个对象动态的加上一系列的动作,而不需要因为这些动作的不同而产生大量的继承类。这个模式在JDK中几乎无处不在,所以,下面的列表只是一些典型的。

  1.  
  2.  
  3. java.io.BufferedInputStream(InputStream)  
  4.  
  5. java.io.DataInputStream(InputStream)  
  6.  
  7. java.io.BufferedOutputStream(OutputStream)  
  8.  
  9. java.util.zip.ZipOutputStream(OutputStream)  
  10.  
  11. java.util.Collections#checked[List|Map|Set|SortedSet|SortedMap]()  
  12.  

Facade:

用一个简单的接口包状一组组件,接口,抽象或是子系统。

  1. java.lang.Class  
  2.  
  3. javax.faces.webapp.FacesServlet  
  4.  

Flyweight:

有效率地存储大量的小的对象。

  1. java.lang.Integer#valueOf(int)  
  2.  
  3. java.lang.Boolean#valueOf(boolean)  
  4.  
  5. java.lang.Byte#valueOf(byte)  
  6.  
  7. java.lang.Character#valueOf(char)  
  8.  

Proxy:

用一个简单的对象来代替一个复杂的对象。

  1. java.lang.reflect.Proxy  
  2.  

RMI

Creational(创建模式)

Abstract factory:

创建一组有关联的对象实例。这个模式在JDK中也是相当的常见,还有很多的framework例如Spring。我们很容易找到这样的实例。

  1. java.util.Calendar#getInstance()  
  2.  
  3. java.util.Arrays#asList()  
  4.  
  5. java.util.ResourceBundle#getBundle()  
  6.  
  7. java.sql.DriverManager#getConnection()  
  8.  
  9. java.sql.Connection#createStatement()  
  10.  
  11. java.sql.Statement#executeQuery()  
  12.  
  13. java.text.NumberFormat#getInstance()  
  14.  
  15. javax.xml.transform.TransformerFactory#newInstance()  
  16.  

Builder:

主要用来简化一个复杂的对象的创建。这个模式也可以用来实现一个 Fluent Interface。

  1. java.lang.StringBuilder#append()  
  2.  
  3. java.lang.StringBuffer#append()  
  4.  
  5. java.sql.PreparedStatement  
  6.  
  7. javax.swing.GroupLayout.Group#addComponent()  
  8.  

Factory:

简单来说,按照需求返回一个类型的实例。

  1. java.lang.Proxy#newProxyInstance()  
  2.  
  3. java.lang.Object#toString()  
  4.  
  5. java.lang.Class#newInstance()  
  6.  
  7. java.lang.reflect.Array#newInstance()  
  8.  
  9. java.lang.reflect.Constructor#newInstance()  
  10.  
  11. java.lang.Boolean#valueOf(String)  
  12.  
  13. java.lang.Class#forName()  
  14.  

Prototype:

使用自己的实例创建另一个实例。有时候,创建一个实例然后再把已有实例的值拷贝过去,是一个很复杂的动作。所以,使用这个模式可以避免这样的复杂性。

  1. java.lang.Object#clone()  
  2.  
  3. java.lang.Cloneable  
  4.  

Singleton:

只允许一个实例。在 Effective Java中建议使用Emun.

  1. java.lang.Runtime#getRuntime()  
  2.  
  3. java.awt.Toolkit#getDefaultToolkit()  
  4.  
  5. java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()  
  6.  
  7. java.awt.Desktop#getDesktop()  
  8.  

Behavioral(行为模式)

Chain of responsibility:

把一个对象在一个链接传递直到被处理。在这个链上的所有的对象有相同的接口(抽象类)但却有不同的实现。

  1. java.util.logging.Logger#log()  
  2.  
  3. javax.servlet.Filter#doFilter()  
  4.  

Command:

把一个或一些命令封装到一个对象中。

  1. java.lang.Runnable  
  2.  
  3. javax.swing.Action  
  4.  

Interpreter:

一个语法解释器的模式。

  1. java.util.Pattern  
  2.  
  3. java.text.Normalizer  
  4.  
  5. java.text.Format  
  6.  

Iterator:

提供一种一致的方法来顺序遍历一个容器中的所有元素。

  1. java.util.Iterator  
  2.  
  3. java.util.Enumeration  
  4.  

Mediator:

用来减少对象单的直接通讯的依赖关系。使用一个中间类来管理消息的方向。

  1. java.util.Timer  
  2.  
  3. java.util.concurrent.Executor#execute()  
  4.  
  5. java.util.concurrent.ExecutorService#submit()  
  6.  
  7. java.lang.reflect.Method#invoke()  
  8.  

Memento:

给一个对象的状态做一个快照。Date类在内部使用了一个long型来做这个快照。

  1. java.util.Date  
  2.  
  3. java.io.Serializable  
  4.  

Null Object:

这个模式用来解决如果一个Collection中没有元素的情况。

  1. java.util.Collections#emptyList()  
  2.  
  3. java.util.Collections#emptyMap()  
  4.  
  5. java.util.Collections#emptySet()  
  6.  

Observer:

允许一个对象向所有的侦听的对象广播自己的消息或事件。

  1. java.util.EventListener  
  2.  
  3. javax.servlet.http.HttpSessionBindingListener  
  4.  
  5. javax.servlet.http.HttpSessionAttributeListener  
  6.  
  7. javax.faces.event.PhaseListener  
  8.  

State:

这个模式允许你可以在运行时很容易地根据自身内部的状态改变对象的行为。

  1. java.util.Iterator  
  2.  
  3. javax.faces.lifecycle.LifeCycle#execute()  
  4.  

Strategy:

定义一组算法,并把其封装到一个对象中。然后在运行时,可以灵活的使用其中的一个算法。

  1. java.util.Comparator#compare()  
  2.  
  3. javax.servlet.http.HttpServlet  
  4.  
  5. javax.servlet.Filter#doFilter()  
  6.  

Template method:

允许子类重载部分父类而不需要完全重写。

  1. java.util.Collections#sort()  
  2.  
  3. java.io.InputStream#skip()  
  4.  
  5. java.io.InputStream#read()  
  6.  
  7. java.util.AbstractList#indexOf()  
  8.  

Visitor:

作用于某个对象群中各个对象的操作. 它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作.

  1. javax.lang.model.element.Element 和javax.lang.model.element.ElementVisitor  
  2.  
  3. javax.lang.model.type.TypeMirror 和javax.lang.model.type.TypeVisitor  
  4.  

 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...