JAVA中設計模式的實際應用
結構型模式:
介面卡模式:
用來把一個介面轉化成另一個介面。
- 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.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()