原文出處: javacodegeeks 譯文出處:deepinmind
這也是篇老文了,相信很多人也看過。前面那些廢話就不翻譯了,直接切入正題吧~
結構型模式:
適配器模式:
用來把一個接口轉化成另一個接口。
- java.util.Arrays#asList()
- javax.swing.JTable(TableModel)
- java.io.InputStreamReader(InputStream)
- java.io.OutputStreamWriter(OutputStream)
- javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
- javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()
橋接模式:
這個模式將抽象和抽象操作的實現進行了解耦,這樣使得抽象和實現可以獨立地變化。
- AWT (It provides an abstraction layer which maps onto the native OS the windowing support.)
- JDBC
組合模式
使得客戶端看來單個對象和對象的組合是同等的。換句話說,某個類型的方法同時也接受自身類型作為參數。
- javax.swing.JComponent#add(Component)
- java.awt.Container#add(Component)
- java.util.Map#putAll(Map)
- java.util.List#addAll(Collection)
- java.util.Set#addAll(Collection)
裝飾者模式:
動態的給一個對象附加額外的功能,這也是子類的一種替代方式。可以看到,在創建一個類型的時候,同時也傳入同一類型的對象。這在JDK里隨處可見,你會發現它無處不在,所以下面這個列表只是一小部分。
- java.io.BufferedInputStream(InputStream)
- java.io.DataInputStream(InputStream)
- java.io.BufferedOutputStream(OutputStream)
- java.util.zip.ZipOutputStream(OutputStream)
- java.util.Collections#checkedList|Map|Set|SortedSet|SortedMap
門面模式:
給一組組件,接口,抽象,或者子系統提供一個簡單的接口。
- java.lang.Class
- javax.faces.webapp.FacesServlet
享元模式
使用緩存來加速大量小對象的訪問時間。
- java.lang.Integer#valueOf(int)
- java.lang.Boolean#valueOf(boolean)
- java.lang.Byte#valueOf(byte)
- java.lang.Character#valueOf(char)
代理模式
代理模式是用一個簡單的對象來代替一個復雜的或者創建耗時的對象。
- java.lang.reflect.Proxy
- RMI
創建模式
抽象工廠模式
抽象工廠模式提供了一個協議來生成一系列的相關或者獨立的對象,而不用指定具體對象的類型。它使得應用程序能夠和使用的框架的具體實現進行解耦。這在JDK或者許多框架比如Spring中都隨處可見。它們也很容易識別,一個創建新對象的方法,返回的卻是接口或者抽象類的,就是抽象工廠模式了。
- java.util.Calendar#getInstance()
- java.util.Arrays#asList()
- java.util.ResourceBundle#getBundle()
- java.sql.DriverManager#getConnection()
- java.sql.Connection#createStatement()
- java.sql.Statement#executeQuery()
- java.text.NumberFormat#getInstance()
- javax.xml.transform.TransformerFactory#newInstance()
建造模式(Builder)
定義了一個新的類來構建另一個類的實例,以簡化復雜對象的創建。建造模式通常也使用方法鏈接來實現。
- java.lang.StringBuilder#append()
- java.lang.StringBuffer#append()
- java.sql.PreparedStatement
- javax.swing.GroupLayout.Group#addComponent()
工廠方法
就是一個返回具體對象的方法。
- java.lang.Proxy#newProxyInstance()
- java.lang.Object#toString()
- java.lang.Class#newInstance()
- java.lang.reflect.Array#newInstance()
- java.lang.reflect.Constructor#newInstance()
- java.lang.Boolean#valueOf(String)
- java.lang.Class#forName()
原型模式
使得類的實例能夠生成自身的拷貝。如果創建一個對象的實例非常復雜且耗時時,就可以使用這種模式,而不重新創建一個新的實例,你可以拷貝一個對象並直接修改它。
- java.lang.Object#clone()
- java.lang.Cloneable
單例模式
用來確保類只有一個實例。Joshua Bloch在Effetive Java中建議到,還有一種方法就是使用枚舉。
- java.lang.Runtime#getRuntime()
- java.awt.Toolkit#getDefaultToolkit()
- java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()
- java.awt.Desktop#getDesktop()
行為模式
責任鏈模式
通過把請求從一個對象傳遞到鏈條中下一個對象的方式,直到請求被處理完畢,以實現對象間的解耦。
- java.util.logging.Logger#log()
- javax.servlet.Filter#doFilter()
命令模式
將操作封裝到對象內,以便存儲,傳遞和返回。
- java.lang.Runnable
- javax.swing.Action
解釋器模式
這個模式通常定義了一個語言的語法,然后解析相應語法的語句。
- java.util.Pattern
- java.text.Normalizer
- java.text.Format
迭代器模式
提供一個一致的方法來順序訪問集合中的對象,這個方法與底層的集合的具體實現無關。
- java.util.Iterator
- java.util.Enumeration
中介者模式
通過使用一個中間對象來進行消息分發以及減少類之間的直接依賴。
- java.util.Timer
- java.util.concurrent.Executor#execute()
- java.util.concurrent.ExecutorService#submit()
- java.lang.reflect.Method#invoke()
備忘錄模式
生成對象狀態的一個快照,以便對象可以恢復原始狀態而不用暴露自身的內容。Date對象通過自身內部的一個long值來實現備忘錄模式。
- java.util.Date
- java.io.Serializable
空對象模式
這個模式通過一個無意義的對象來代替沒有對象這個狀態。它使得你不用額外對空對象進行處理。
- java.util.Collections#emptyList()
- java.util.Collections#emptyMap()
- java.util.Collections#emptySet()
觀察者模式
它使得一個對象可以靈活的將消息發送給感興趣的對象。
- java.util.EventListener
- javax.servlet.http.HttpSessionBindingListener
- javax.servlet.http.HttpSessionAttributeListener
- javax.faces.event.PhaseListener
狀態模式
通過改變對象內部的狀態,使得你可以在運行時動態改變一個對象的行為。
- java.util.Iterator
- javax.faces.lifecycle.LifeCycle#execute()
策略模式
使用這個模式來將一組算法封裝成一系列對象。通過傳遞這些對象可以靈活的改變程序的功能。
- java.util.Comparator#compare()
- javax.servlet.http.HttpServlet
- javax.servlet.Filter#doFilter()
模板方法模式
讓子類可以重寫方法的一部分,而不是整個重寫,你可以控制子類需要重寫那些操作。
- java.util.Collections#sort()
- java.io.InputStream#skip()
- java.io.InputStream#read()
- java.util.AbstractList#indexOf()
訪問者模式
提供一個方便的可維護的方式來操作一組對象。它使得你在不改變操作的對象前提下,可以修改或者擴展對象的行為。
- javax.lang.model.element.Element and javax.lang.model.element.ElementVisitor
- javax.lang.model.type.TypeMirror and javax.lang.model.type.TypeVisitor
譯者注:很多地方可能會存在爭議,是否是某種模式其實並不是特別重要,重要的是它們的設計能為改善我們的代碼提供一些經驗。