設計模式面試題

Birdge 橋接模式:

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

GOF在提出橋樑模式的時候指出,橋樑模式的用意是"將抽象化(Abstraction)與實現化(Implementation)脫耦,使得二者可以獨立地變化"。這句話有三個關鍵詞,也就是抽象化、實現化和脫耦。

在Java應用中,對於橋接模式有一個非常典型的例子,就是應用程序使用JDBC驅動程序進行開發的方式。所謂驅動程序,指的是按照預先約定好的接口來操作計算機系統或者是外圍設備的程序。

 

Adapter 適配器模式:

用來把一個接口轉化成另一個接口。使得原本由於接口不兼容而不能一起工作的那些類可以在一起工作。

java.util.Arrays#asList()

java.io.InputStreamReader(InputStream)

java.io.OutputStreamWriter(OutputStream)

 

Composite 組合模式:

又叫做部分-整體模式,使得客戶端看來單個對象和對象的組合是同等的。換句話說,某個類型的方法同時也接受自身類型作爲參數。

avax.swing.JComponent#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

 

Facade 門面模式,即外觀模式:

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

java.lang.Class

javax.faces.webapp.FacesServlet

 

Flyweight 享元模式:

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

java.lang.Integer#valueOf(int)

java.lang.Boolean#valueOf(boolean)

java.lang.Byte#valueOf(byte)

java.lang.Character#valueOf(char)

 

Proxy 代理模式:

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

java.lang.reflect.Proxy

RMI

 

Abstract Factory 抽象工廠模式:

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

 

 

抽象工廠模式

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章