不管你是參與Java面試仍是C#面試,設計模式和軟件設計問題在程序員面試中是必不可少的一部分。編程和設計技二者相得益彰,一名出色的程序員也是一名出色的設計師,他們懂得如何利用代碼來解決問題或者軟件設計,可是這些技能須要不斷提高。這就要求你不斷的保持設計理念,不管編程項目的大小,從失敗中總結經驗。html
從面向對象的設計原則開始學習是個不錯的起點。本文總結了在各類面試過程當中常常被說起的一些設計問題。文中分爲兩部分,一類爲初學者,另外一類專爲中高級技術人員準備。java
1、入門級程序員的面試題:程序員
這些軟件設計和設計模式的先關問題大多會出如今初學者面試情景中,什麼是設計模式?特定的設計模式又是什麼?等等這些概念,也許你很輕易回答這些概念,但文內提供的這些問題也許能給你帶來更多價值。面試
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設計模式案例。
2、進階級程序員的面試題:
1. 舉例說明你何時會用抽象類,何時更願意使用接口?
這是一個很常見的面試問題,並不算難。接口和抽象類都按照「不爲實現寫代碼」的設計原則,這是爲了增長代碼的靈活性,以應付不斷變化的要求。下面是一些幫助你回答這個問題的指南:
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等。若是您在面試過程當中遇到了一些有趣的話題,不妨與咱們分享下。