1. 程式人生 > >Java常見設計模式面試題

Java常見設計模式面試題

1.請列舉出在JDK中幾個常用的設計模式?

單例模式(Singleton pattern)用於RuntimeCalendar和其他的一些類中。工廠模式(Factory pattern)被用於各種不可變的類如 Boolean,像Boolean.valueOf,觀察者模式(Observer pattern)被用於 Swing 和很多的事件監聽中。裝飾器設計模式(Decorator design pattern)被用於多個 Java IO 類中。

2.什麼是設計模式?你是否在你的程式碼裡面使用過任何設計模式?

設計模式是世界上各種各樣程式設計師用來解決特定設計問題的嘗試和測試的方法。設計模式是程式碼可用性的延伸

3.Java 中什麼叫單例設計模式?請用Java 寫出執行緒安全的單例模式

單例模式重點在於在整個系統上共享一些建立時較耗資源的物件。整個應用中只維護一個特定類例項,它被所有元件共同使用。Java.lang.Runtime是單例模式的經典例子。從 Java 5 開始你可以使用列舉(enum)來實現執行緒安全的單例。

4.在 Java 中,什麼叫觀察者設計模式(observer design pattern)

觀察者模式是基於物件的狀態變化和觀察者的通訊,以便他們作出相應的操作。簡單的例子就是一個天氣系統,當天氣變化時必須在展示給公眾的檢視中進行反映。這個檢視物件是一個主體,而不同的檢視是觀察者。

5.使用工廠模式最主要的好處是什麼?在哪裡使用?

工廠模式的最大好處是增加了建立物件時的封裝層次。如果你使用工廠來建立物件,之後你可以使用更高階和更高效能的實現來替換原始的產品實現或類,這不需要在呼叫層做任何修改。

6.舉一個用 Java 實現的裝飾模式(decorator design pattern)?它是作用於物件層次還是類層次?

裝飾模式增加強了單個物件的能力。Java IO 到處都使用了裝飾模式,典型例子就是 Buffered 系列類如BufferedReaderBufferedWriter,它們增強了ReaderWriter物件,以實現提升效能的 Buffer 層次的讀取和寫入。

7.在 Java 中,為什麼不允許從靜態方法中訪問非靜態變數?

Java 中不能從靜態上下文訪問非靜態資料只是因為非靜態變數是跟具體的物件例項關聯的,而靜態的卻沒有和任何例項關聯。

8.設計一個 ATM 機,請說出你的設計思路?

比如設計金融系統來說,必須知道它們應該在任何情況下都能夠正常工作。不管是斷電還是其他情況,ATM 應該保持正確的狀態(事務) , 想想 加鎖(locking)、事務(transaction)、錯誤條件(error condition)、邊界條件(boundary condition) 等等。儘管你不能想到具體的設計,但如果你可以指出非功能性需求,提出一些問題,想到關於邊界條件,這些都會是很好的。

9.在 Java 中,什麼時候用過載,什麼時候用重寫?

如果你看到一個類的不同實現有著不同的方式來做同一件事,那麼就應該用重寫(overriding),而過載(overloading)是用不同的輸入做同一件事。在 Java 中,過載的方法簽名不同,而重寫並不是。

10.舉例說明什麼情況下會更傾向於使用抽象類而不是介面?

介面和抽象類都遵循”面向介面而不是實現編碼”設計原則,它可以增加程式碼的靈活性,可以適應不斷變化的需求。下面有幾個點可以幫助你回答這個問題:

  1. 在 Java 中,你只能繼承一個類,但可以實現多個介面。所以一旦你繼承了一個類,你就失去了繼承其他類的機會了。
  2. 介面通常被用來表示附屬描述或行為如:Runnable、Clonable、Serializable等等,因此當你使用抽象類來表示行為時,你的類就不能同時是RunnableClonable(注:這裡的意思是指如果把Runnable等實現為抽象類的情況),因為在 Java 中你不能繼承兩個類,但當你使用介面時,你的類就可以同時擁有多個不同的行為。
  3. 在一些對時間要求比較高的應用中,傾向於使用抽象類,它會比介面稍快一點。
  4. 如果希望把一系列行為都規範在類繼承層次內,並且可以更好地在同一個地方進行編碼,那麼抽象類是一個更好的選擇。有時,介面和抽象類可以一起使用,介面中定義函式,而在抽象類中定義預設的實現。

11.什麼是 MVC 設計模式?舉一個 MVC 設計模式的例子?

12. 什麼是責任鏈模式(Chain of Responsibility)?

13. 什麼是介面卡模式?舉用 Java 實現介面卡模式的例子?

。。。。。。

加油!小夥伴!