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

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

這是一些和設計模式還有軟件設計都相關的問題。這些問題須要一些思考和經驗來回答。在大多數狀況下,面試官並非須要一個確切的答\案,而是但願聽到你的想法,你對這個問題是怎麼考慮的,你能不能想通這個問題,能不能挖掘一些沒有告訴你的潛在信息。在解決一個問題時你應該考慮什麼等等可使你經驗大漲。總的來講,這些設計問題會讓你動起腦來。有時面試官也會讓你寫代碼,因此仍是準備一下吧。若是你知道編程和設計技巧中的概念,例子和程序,你應該能夠在這些問題中有突出的表現。html

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

這是很經常使用但又是很難回答的設計面試問題。接口和抽象類都遵循」面向接口而不是實現編碼」設計原則,它能夠增長代碼的靈活性,能夠適應不斷變化的需求。下面有幾個點能夠幫助你回答這個問題:程序員

  1. 在Java中,你只能繼承一個類,但能夠實現多個接口。因此一旦你繼承了一個類,你就失去了繼承其餘類的機會了。面試

  2. 接口一般被用來表示附屬描述或行爲如:Runnable、Clonable、Serializable等等,所以當你使用抽象類來表示行爲時,你的類就不能同時是RunnableClonable(譯者注:這裏的意思是指若是把Runnable等實現爲抽象類的狀況),由於在Java中你不能繼承兩個類,但當你使用接口時,你的類就能夠同時擁有多個不一樣的行爲。編程

  3. 在一些對時間要求比較高的應用中,傾向於使用抽象類,它會比接口稍快一點。設計模式

  4. 若是但願把一系列行爲都規範在類繼承層次內,而且能夠更好地在同一個地方進行編碼,那麼抽象類是一個更好的選擇。有時,接口和抽象類能夠一塊兒使用,接口中定義函數,而在抽象類中定義默認的實現。安全

但願瞭解更多關於Java接口的,能夠看個人文章Java接口須要知道的10件事多線程

2. 設計一個販賣機,能夠接收不一樣的貨幣,出售不一樣的產品?併發

這是一個開放設計問題,你能夠做爲練習,嘗試着寫出設計文檔、代碼和JUnit測試而不是隻是解決這個問題,看看它花了你多少時間獲得解決方案和獲得須要的原形。理想狀況下,這個問題應該能夠在3個小時內解決,至少應該獲得一個能夠運行的版本。ide

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等等還有不少重要的專業軟件設計問題。若是你遇到一些有趣的值得分享的設計問題,不妨分享出來。

相關文章
相關標籤/搜索