20個設計模式和軟體設計面試問題

ImportNew發表於2014-08-17

不管是參加 Java 面試還是 C# 面試,設計模式和軟體設計都是任何程式設計面試中的必問問題。實際上,程式設計能力和設計技巧是對彼此很好的補充。一個好的程式設計師通常都是一個好的軟體設計人員。他們知道怎麼把一個問題分割成一段段程式碼或者軟體設計,但這些能力和技巧並不能憑空而來。你需要持續做大型、小型系統的設計和編碼,並且不斷從錯誤中學習。從物件導向設計原則 開始是一個不錯的選擇。好吧,這篇文章是關於一些在各種面試中頻繁問到的一些設計問題。考慮到針對性和困難度,我把它們分成兩個種類,分別針對初學者和有經驗的人。

對中高階別的設計模式面試問題

這是一些和設計模式還有軟體設計都相關的問題。這些問題需要一些思考和經驗來回答。在大多數情況下,面試官並不是需要一個確切的答案,而是希望聽到你的想法,你對這個問題是怎麼考慮的,你能不能想通這個問題,能不能挖掘一些沒有告訴你的潛在資訊。在解決一個問題時你應該考慮什麼等等可以使你經驗大漲。總的來說,這些設計問題會讓你動起腦來。有時面試官也會讓你寫程式碼,所以還是準備一下吧。如果你知道程式設計和設計技巧中的概念,例子和程式,你應該可以在這些問題中有突出的表現。

1. 舉出一個例子,在這種情況你會更傾向於使用抽象類,而不是介面?

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

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

希望瞭解更多關於 Java 介面的,可以看我的文章 Java 介面需要知道的 10 件事。

2. 設計一個販賣機,可以接收不同的貨幣,出售不同的產品?

這是一個開放設計問題,你可以作為練習,嘗試著寫出設計文件、程式碼和 JUnit 測試而不是隻是解決這個問題,看看它花了你多少時間得到解決方案和得到需要的原形。理想情況下,這個問題應該可以在 3 個小時內解決,至少應該得到一個可以執行的版本。

3. 你有一個Smartphone類,可以派生如IPhone、AndroidPhone、WindowsMobilePhone

它還可以是一些有著品牌的手機名稱,你會怎麼設計這個類系統呢。

這是另外一個設計模式練習,你可以應用你的物件導向設計技巧來得到一個設計,這個設計需要足夠靈活能夠支援未來產品的擴充套件,足夠穩定能夠支援在現有模型進行修改。

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

對有經驗的 Java 設計師來說,這是一個相當簡單的問題。如果你看到一個類的不同實現有著不同的方式來做同一件事,那麼就應該用重寫(overriding),而過載(overloading)是用不同的輸入做同一件事。在 Java 中,過載的方法簽名不同,而重寫並不是。

5. 設計一個 ATM 機?

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

6. 你正在寫一些類提供市場資料,你知道你可以不定時切換不同的廠商如 Reuters、wombat 或者直接的批發商, 你會如何設計你的市場資料系統。

這是一個非常有趣的設計面試問題,並且真的在一家大的投資銀行問到過,如果你是用 Java 編碼的話這是一個相當平常的場景。最主要的一點是你要有一個MarketData介面,它會有呼叫端需要的方法如:getBid ()、getPrice ()、getLevel ()等等,而MarketData應該由一個MarketDataProvider通過 依賴注入(dependency injection) 組成。因此,當你修改你的MarketData 提供器(MarketDataProvider)時,呼叫端不會受影響,因為它們是通過MarketData介面或類的方法來訪問的。

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

你在 Java 中不能從靜態上下文訪問非靜態資料只是因為非靜態變數是跟具體的物件例項關聯的,而靜態的卻沒有和任何例項關聯。你可以看我的文章為什麼在靜態上下文中不能訪問非靜態變數檢視詳細的討論。

8. 在 Java 中設計一個併發規則的 pipeline?

併發程式設計併發設計這些天很火,它可以充分利用現在不斷提升的高階處理器的處理能力,而 Java 成為一個多執行緒語言也從這種情況獲益良多。設計一個併發系統需要記住的最關鍵的點是執行緒安全,不可變性,本地變數和避免使用 static 或者類變數(instance variables)。你只需要想著每一類都可以同時被多個執行緒同時執行,所以最好的做法就是每一個執行緒都處理自己的資料 ,不跟其他資料互動,並且執行時只需要最小的同步保證。這個問題可以涉及到從最初的討論到完整的類和介面編碼,但只要你記住併發中最重要的點和問題如,競爭條件(race condition)、死鎖(deadlock)、記憶體互動問題(memory interference)、原子性、ThreadLocal 變數等,你都可以回答它。

給初學者的設計模式面試問題

這些軟體設計和設計模式問題大多在初學者層次時被問起,目的只是瞭解一下候選人(應聘者)對設計模式知道多少,如, 設計模式是什麼 或者 一個特定的設計模式做什麼 ?這些問題通過簡單地記憶概念就可以回答,但就資訊和知識而言還是有價值的。

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

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

2. 你可以說出幾個在 JDK 庫中使用的設計模式嗎?

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

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

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

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

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

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

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

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

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

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

8, Java 中什麼是表示層設計模式(FrontController design pattern)?舉一個使用表示層設計模式(front controller pattern)的例子?

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

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

這些留給你自己做練習,作為面試準備,試著去找出這些設計模式的答案。

這些是我在很多面試中都看到的設計模式問題,當然,在 google 面試和各種各樣的公司如 Amzone、Microsoft 等等還有很多重要的專業軟體設計問題。如果你遇到一些有趣的值得分享的設計問題,不妨分享出來。

相關文章