JDK裏的設計模式

一.結構型模式

1.適配器模式

        用來把一個接口轉化成另一個接口。

        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()

 

2.橋接模式

        這個模式將抽象和抽象操作的實現進行了解耦,這樣使得抽象和實現可以獨立地變化。

        AWT (It provides an abstraction layer which maps onto the native OS the windowing support.)

        JDBC

 

3.組合模式

        使得客戶端看來單個對象和對象的組合是同等的。換句話說,某個類型的方法同時也接受自身類型作爲參數。

        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)

 

4.裝飾者模式

        動態的給一個對象附加額外的功能,這也是子類的一種替代方式。可以看到,在創建一個類型的時候,同時也傳入同一類型的對象。這在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

 

5.門面模式

        給一組組件,接口,抽象,或者子系統提供一個簡單的接口。

        java.lang.Class

        javax.faces.webapp.FacesServlet

 

6.享元模式

        使用緩存來加速大量小對象的訪問時間。

        java.lang.Integer#valueOf(int)

        java.lang.Boolean#valueOf(boolean)

        java.lang.Byte#valueOf(byte)

        java.lang.Character#valueOf(char)

 

7.代理模式

        代理模式是用一個簡單的對象來代替一個複雜的或者創建耗時的對象。

        java.lang.reflect.Proxy

        RMI

 

二.創建模式

8.抽象工廠模式

        抽象工廠模式提供了一個協議來生成一系列的相關或者獨立的對象,而不用指定具體對象的類型。它使得應用程序能夠和使用的框架的具體實現進行解耦。這在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()

 

9.建造模式(Builder)

        定義了一個新的類來構建另一個類的實例,以簡化複雜對象的創建。建造模式通常也使用方法鏈接來實現。

        java.lang.StringBuilder#append()

        java.lang.StringBuffer#append()

        java.sql.PreparedStatement

        javax.swing.GroupLayout.Group#addComponent()

 

10.工廠方法

        就是一個返回具體對象的方法。

        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()

 

11.原型模式

        使得類的實例能夠生成自身的拷貝。如果創建一個對象的實例非常複雜且耗時時,就可以使用這種模式,而不重新創建一個新的實例,你可以拷貝一個對象並直接修改它。

        java.lang.Object#clone()

        java.lang.Cloneable

 

12.單例模式

        用來確保類只有一個實例。Joshua Bloch在Effetive Java中建議到,還有一種方法就是使用枚舉。

        java.lang.Runtime#getRuntime()

        java.awt.Toolkit#getDefaultToolkit()

        java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()

        java.awt.Desktop#getDesktop()

 

三.行爲模式

13.責任鏈模式

        通過把請求從一個對象傳遞到鏈條中下一個對象的方式,直到請求被處理完畢,以實現對象間的解耦。

        java.util.logging.Logger#log()

        javax.servlet.Filter#doFilter()

 

14.命令模式

        將操作封裝到對象內,以便存儲,傳遞和返回。

        java.lang.Runnable

        javax.swing.Action

 

15.解釋器模式

        這個模式通常定義了一個語言的語法,然後解析相應語法的語句。

        java.util.Pattern

        java.text.Normalizer

        java.text.Format

 

16.迭代器模式

        提供一個一致的方法來順序訪問集合中的對象,這個方法與底層的集合的具體實現無關。

        java.util.Iterator

        java.util.Enumeration

 

17.中介者模式

        通過使用一箇中間對象來進行消息分發以及減少類之間的直接依賴。

        java.util.Timer

        java.util.concurrent.Executor#execute()

        java.util.concurrent.ExecutorService#submit()

        java.lang.reflect.Method#invoke()

 

18.備忘錄模式

        生成對象狀態的一個快照,以便對象可以恢復原始狀態而不用暴露自身的內容。Date對象通過自身內部的一個long值來實現備忘錄模式。

        java.util.Date

        java.io.Serializable

 

19.空對象模式

        這個模式通過一個無意義的對象來代替沒有對象這個狀態。它使得你不用額外對空對象進行處理。

        java.util.Collections#emptyList()

        java.util.Collections#emptyMap()

        java.util.Collections#emptySet()

 

20.觀察者模式

        它使得一個對象可以靈活的將消息發送給感興趣的對象。

        java.util.EventListener

        javax.servlet.http.HttpSessionBindingListener

        javax.servlet.http.HttpSessionAttributeListener

        javax.faces.event.PhaseListener

 

21.狀態模式

        通過改變對象內部的狀態,使得你可以在運行時動態改變一個對象的行爲。

        java.util.Iterator

        javax.faces.lifecycle.LifeCycle#execute()

 

22.策略模式

        使用這個模式來將一組算法封裝成一系列對象。通過傳遞這些對象可以靈活的改變程序的功能。

        java.util.Comparator#compare()

        javax.servlet.http.HttpServlet

        javax.servlet.Filter#doFilter()

 

23.模板方法模式

        讓子類可以重寫方法的一部分,而不是整個重寫,你可以控制子類需要重寫那些操作。

        java.util.Collections#sort()

        java.io.InputStream#skip()

        java.io.InputStream#read()

        java.util.AbstractList#indexOf()

 

24.訪問者模式

        提供一個方便的可維護的方式來操作一組對象。它使得你在不改變操作的對象前提下,可以修改或者擴展對象的行爲。

        javax.lang.model.element.Element and javax.lang.model.element.ElementVisitor

        javax.lang.model.type.TypeMirror and javax.lang.model.type.TypeVisitor

 

        譯者注:很多地方可能會存在爭議,是否是某種模式其實並不是特別重要,重要的是它們的設計能爲改善我們的代碼提供一些經驗。


英文原文鏈接:http://www.javacodegeeks.com/2011/03/design-patterns-in-jdk.html

發佈了18 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章