設計模式大集錦 程序員面試全攻略

轉自http://www.csdn.net/article/2012-06-04/2806324-software-design-interview-questions

一、入門級程序員的面試題:

這些軟件設計和設計模式的先關問題大多會出現在初學者面試情景中,什麼是設計模式?特定的設計模式又是什麼?等等這些概念,也許你很輕易回答這些概念,但文內提供的這些問題也許能給你帶來更多價值。

1. 什麼是設計模式?在你編碼過程中使用了哪些設計模式?

每位程序員都會利用自身經歷來回答這些特定的設計問題。設計模式是代碼重用的擴展。

2. 你能說出在標準的JDK庫中使用的一些設計模式嗎?

Decorator設計模式常被用於各種Java IO類中,Singleton模式常被用在運行環節中,Calendar以及各種其他類,Factory(工廠)模式常被用於各種不可變類,比如Boolean。Boolean.valueOf和Observer模式常被用於Swing和許多事件監聽器框架中。

3. 在Java中Singleton設計模式是什麼?爲線程安全Singleton編碼。

Singleton模式在整個系統中主要是共享模式。在整個應用程序實例中只保持一個特定的類,這是由所以模塊共享決定的。Java.lang.Runtime是Singleton設計模式中一個典型範例。關於此問題你可以查看更多。從Java 5版本開始,你可以爲安全線程singleton模式使用enum

4. 使用Factory模式主要優勢是什麼?你會在哪種情況下使用?

Factory模式最主要的優勢在於當創建對象時可提高封裝水平。如果你使用Factory模式來創建對象,你可以在後期重置最初產品的裝置或者無須任何客戶層就可實現更先進更高性能的類。可以查看我曾發表過的有關Factory模式的更多細節及優點。

5. Java中Observer設計模式是什麼?

Observer設計模式基於對象的變化而改變。比如:天氣系統,在這裏必須將天氣變化的視圖呈現給觀衆。這裏天氣項目是主體而非不同的觀察者。通過這篇文章,查看在Java中Observer模式。

6. 例舉一個在Java中使用Decorator模式的案例?它從事的是對象級別還是類級別?

Decorator模式可提高個體對象的能力。Java IO廣泛使用Decorator模式和Buffered類型的一些經典例子,比如BufferedReader和BufferedWriter,增強讀者和作家執行Buffer級別的閱讀和寫作從而提高性能。瞭解更多

7. 什麼是MVC設計模式?請例舉一個MVC設計模式案例。

8. Java中FrontController設計模式是什麼?請例舉一個FrontController設計模式案例。

9. Responsibility設計模式是什麼?

10. Adapter設計模式是什麼?請例舉一個在Java中的Adapter設計模式案例。

二、進階級程序員的面試題:

1. 舉例說明你什麼時候會用抽象類,什麼時候更願意使用接口?

這是一個很常見的面試問題,並不算難。接口和抽象類都按照“不爲實現寫代碼”的設計原則,這是爲了增加代碼的靈活性,以應付不斷變化的要求。下面是一些幫助你回答這個問題的指南:

  • 在Java中,你只能繼承一個類,但實現多個接口。所以你繼承一個類的時候就無法再繼承別的類了。
  • 接口是用來代表形容詞或行爲,例如Runnable、Clonable、Serializable等。因此,如果您使用一個抽象類來實現Runnable和Clonacle,你就不可以使你的類同時實現這兩個功能,而如果接口的話就沒問題。
  • 抽象類是比接口稍快,所以很在乎時間的應用盡量使用抽象類。
  • 如果多個繼承層次的共同行爲在在同一個地方編寫更好,那麼抽象類會是更好的選擇。有時候可以在接口裏定義函數但是在抽象類裏默認功能就能實現接口和抽象類共同工作了。瞭解Java接口

2. 設計一個能接收不同硬幣、出售不同貨物的自動售貨機。

這是一個比較開放的設計問題,你可以使用它練習文檔設計、寫代碼和JUnit單元測試,而不是僅僅是解決問題。這道題的目標絕不會僅僅是想測出你多久能夠得到解決方案。理想情況下,這個問題應該在3小時內給出一個可工作版本。

3. 你有一個Smartphone類和它派生類iPhone、 AndroidPhone、WindowsPhone等,以及以品牌名稱命名的派生類如SonyPhone等。你該如何設計這一類的系統?

這是另一種設計模式的練習,你充分利用面向對象的設計技巧,保證它有足夠的靈活性來支持新產品,並且在現有模型改變時能夠保證足夠的穩定性。

4. 在Java中,什麼時候該使用overload,什麼時候使用override?

對於一個經驗豐富的設計師來說這是一個非常簡單的問題。重載和覆蓋在Java裏實現的都是同一個功能,但overload的輸入變量不同,override則完全相同。

5. 設計ATM機

我們幾乎都使用過ATM機,但你想過該怎麼設計它嗎?金融系統的設計原則之一就是必須能在所有預期情況下都能夠正常運行。所以無論是發生斷電還是什麼其它暴力問題,ATM機都必須能夠保證正確的狀態。 考慮下鎖、事務處理、錯誤狀態、臨界條件等等。即使你拿不定確切的設計方案,但是能夠指出非功能性需求、提出一些問題或者考慮考慮臨界條件都會對你有幫助。

6. 假設你正在設計市場數據類來保證能夠切換不同的信息供應商,比如Reuters、wombat等等,或者直接交換信息,你該如何設計這個市場信息系統?

這是非常有趣的設計面試問題,實際上在大型投資銀行裏是個很普遍的問題。關鍵在於你需要提供擁有getBid()、getPrice()和getLevel()方法的MarketData接口供客戶請求,同時還需要有一個使用依賴注入的MarketDataProvider組件。這樣在你改變MarketDataProvider時就不會對系統產生影響,因爲客戶是通過MarketData接口或者類調用方法的。

7. 爲什麼Java裏不允許從靜態方法中獲取非靜態變量?

Java裏不允許從靜態方法中獲取非靜態變量僅僅是因爲非靜態變量會和特定的對象實例相關聯,而靜態變量不會。你也可以看看這篇文章的詳細解釋。

8. 用Java設計一個併發規則管道?

併發編程和並行設計非常熱門,因爲它能更高效地利用現在越來越先進的處理器,而且Java被認爲是多線程語言也主要因爲此原因。設計一個併發系統的關鍵在於線程安全、不可變性、本地變量,還有避免使用局部變量和實例變量。你只需要保證多個線程能夠在同一時間執行同一個類,所以最佳解決方案就是每個線程只操作自己的數據,儘量使用最小的同步,尤其是在管道開始時。這個問題可以從初始討論到最終類和接口的編寫實現,但是隻要你記得注意併發問題的關鍵,比如競爭狀態死鎖、內存衝突、原子操作、ThreadLocal變量等等,儘量繞過這些問題。

以上這些設計模式經常出現在面試環節中,比如Google,Amazon, Microsoft等。如果您在面試過程中遇到了一些有趣的話題,不妨與我們分享下。

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