23个经典JDK设计模式

14年前

Structural(结构模式)
Adapter:
把一个接口或是类变成另外一种。
o ● java.util.Arrays#asList()
o ● javax.swing.JTable(TableModel)
o ● java.io.InputStreamReader(InputStream)
o ● java.io.OutputStreamWriter(OutputStream)
o ● javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
o ● javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()
Bridge:
把抽象和实现解藕,于是接口和实现可在完全独立开来。
o ● AWT (提供了抽象层映射于实际的操作系统)
o ● JDBC
Composite:
让使用者把单独的对象和组合对象混用。
o ● javax.swing.JComponent#add(Component)
o ● java.awt.Container#add(Component)
o ● java.util.Map#putAll(Map)
o ● java.util.List#addAll(Collection)
o ● java.util.Set#addAll(Collection)
Decorator:
为一个对象动态的加上一系列的动作,而不需要因为这些动作的不同而产生大量的继承类。这个模式在JDK中几乎无处不在,所以,下面的列表只是一些典型的。
o ● java.io.BufferedInputStream(InputStream)
o ● java.io.DataInputStream(InputStream)
o ● java.io.BufferedOutputStream(OutputStream)
o ● java.util.zip.ZipOutputStream(OutputStream)
o ● java.util.Collections#checked[List|Map|Set|SortedSet|SortedMap]()
Facade:
用一个简单的接口包状一组组件,接口,抽象或是子系统。
o ● java.lang.Class
o ● javax.faces.webapp.FacesServlet
Flyweight:
有效率地存储大量的小的对象。
o ● java.lang.Integer#valueOf(int)
o ● java.lang.Boolean#valueOf(boolean)
o ● java.lang.Byte#valueOf(byte)
o ● java.lang.Character#valueOf(char)
Proxy:
用一个简单的对象来代替一个复杂的对象。
o ● java.lang.reflect.Proxy
o ● RMI
Creational(创建模式)
Abstract factory:
创建一组有关联的对象实例。这个模式在JDK中也是相当的常见,还有很多的framework例如Spring。我们很容易找到这样的实例。
o ● java.util.Calendar#getInstance()
o ● java.util.Arrays#asList()
o ● java.util.ResourceBundle#getBundle()
o ● java.sql.DriverManager#getConnection()
o ● java.sql.Connection#createStatement()
o ● java.sql.Statement#executeQuery()
o ● java.text.NumberFormat#getInstance()
o ● javax.xml.transform.TransformerFactory#newInstance()
Builder:
主要用来简化一个复杂的对象的创建。这个模式也可以用来实现一个 Fluent Interface。
o ● java.lang.StringBuilder#append()
o ● java.lang.StringBuffer#append()
o ● java.sql.PreparedStatement
o ● javax.swing.GroupLayout.Group#addComponent()
Factory:
简单来说,按照需求返回一个类型的实例。
o ● java.lang.Proxy#newProxyInstance()
o ● java.lang.Object#toString()
o ● java.lang.Class#newInstance()
o ● java.lang.reflect.Array#newInstance()
o ● java.lang.reflect.Constructor#newInstance()
o ● java.lang.Boolean#valueOf(String)
o ● java.lang.Class#forName()