細數JDK裏的設計模式

原文出處: javacodegeeks   譯文出處:deepinmind   html

這也是篇老文了,相信不少人也看過。前面那些廢話就不翻譯了,直接切入正題吧~java

結構型模式:

適配器模式:

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

  • 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

組合模式

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

    • 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

 

門面模式:

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

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

代理模式:

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

      • java.lang.reflect.Proxy
      • RMI

建立模式

抽象工廠模式

抽象工廠模式提供了一個協議來生成一系列的相關或者獨立的對象,而不用指定具體對象的類型。它使得應用程序可以和使用的框架的具體實現進行解耦。這在JDK或者許多框架好比Spring中都隨處可見。它們也很容易識別,一個建立新對象的方法,返回的倒是接口或者抽象類的,就是抽象工廠模式了。ide

      • 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

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

相關文章
相關標籤/搜索