設計模式面試題

Birdge 橋接模式:java

這個模式將抽象和抽象操做的實現進行了解耦,這樣使得抽象和實現能夠獨立地變化。web

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

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

 

Adapter 適配器模式:緩存

用來把一個接口轉化成另外一個接口。使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠在一塊兒工做。app

java.util.Arrays#asList()框架

java.io.InputStreamReader(InputStream)webapp

java.io.OutputStreamWriter(OutputStream)ide

 

Composite 組合模式:ui

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

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

相關文章
相關標籤/搜索