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

摘要:無論你是參與Java面試還是C#面試,設計模式和軟件設計問題在程序員面試中是必不可少的一部分。編程和設計技兩者相得益彰,一名出色的程序員也是一名出色的設計師,他們懂得如何利用代碼來解決問題或者軟件設計,但是這些技能需要不斷提升。這就要求你不斷的保持設計理念,無論編程項目的大小,...

無論你是參與Java面試還是C#面試,設計模式和軟件設計問題在程序員面試中是必不可少的一部分。編程和設計技兩者相得益彰,一名出色的程序員也是一名出色的設計師,他們懂得如何利用代碼來解決問題或者軟件設計,但是這些技能需要不斷提升。這就要求你不斷的保持設計理念,無論編程項目的大小,從失敗中總結經驗。

從面向對象的設計原則開始學習是個不錯的起點。本文總結了在各種面試過程中經常被提及的一些設計問題。文中分為兩部分,一類為初學者,另一類專為中高級技術人員準備。

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

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

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等。如果您在面試過程中遇到了一些有趣的話題,不妨與我們分享下。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450733.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450733.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450733.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NOIP2018劃水記

Day -INF: 提前兩周左右停的課吧,每天過著正常的機房生活,每天充滿了歡樂。中間夾著籃球賽,qmcp大展神威(%%%),MVP當之無愧,我跟著我們班一群菜雞劃水水出了季軍(汗&…

多線程鎖,線程池,消費者生產者模型

鎖是怎么存在的? 在python建立之初,開發者目的是為了快速把語言開發出來,如果加上GIL(c語言加鎖),切換時按照100條字節指令來進行線程間的切換 為什么加鎖? 非線程安全,控制一段代碼 1.lock threading.BoundedSemaphore一次可以限制關卡,限制通行次數,不過這個是寫死的 1 im…

【2022】多線程并發編程面試真題

文章目錄4. 多線程4.1 創建線程有哪幾種方式?4.2 說說Thread類的常用方法4.3 run()和start()有什么區別?4.4 線程是否可以重復啟動,會有什么后果?4.5 介紹一下線程的生命周期4.6 如何實現線程同步?4.7 說一說Java多線程…

蘋果面試8大難題及答案

摘要:蘋果這樣的公司通常會在面試過程中向求職者拋出一些邏輯的問題來考研面試者,所以,如果你對進入蘋果感興趣,或者向往類似的公司,又或者只是對邏輯問題感興趣,這些面試難題值得你仔細研究。 導讀&#x…

idea自動導入jar包的快捷鍵

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 見:http://blog.csdn.net/u014771464/article/details/52330254 altenter(光標緊跟在類的后面)

ROS系統玩轉自主移動機器人(3)-- 開源機器人結構介紹

ROS系統玩轉自主移動機器人(3)-- 開源機器人結構介紹 本機器人機械結構設計相關的所有設計文件下載地址為:傳送門 其中包含:三維造型設計文件(所有零件裝配效果)(tips:基于Solidwork…

【2022】JVM常見面試真題詳解

文章目錄5. JVM5.1 JVM包含哪幾部分?5.2 JVM是如何運行的?5.3 Java程序是怎么運行的?5.4 本地方法棧有什么用?5.5 沒有程序計數器會怎么樣?5.6 說一說Java的內存分布情況5.7 類存放在哪里?5.8 局部變量存放…

Linux 基本操作--文件查看 (day3)

一、查看文件-----cat (詳情參考:http://blog.sina.com.cn/s/blog_52f6ead0010127xm.html) 語法結構: cat 查看方式 文件 cat -A : show all 顯示所有內容,相當于-vET [rootlocalhost tmp]# cat -A /etc/profile #注釋:查看/erx/目錄下profile文件的內容 cat -b  :對非空…

如何在面試時寫出高質量的代碼

摘要:有些程序員由于平時沒有養成良好的編程習慣,在面試時寫出的代碼質量不高,最終遺憾地與心儀的公司和職位失之交臂。如何在面試時能寫出高質量的代碼,是很多程序員關心的問題。 程序員在職業生涯中難免要接受編程面試。有些程序…

IntelliJ IDEA添加jar包

見:http://blog.csdn.net/a153375250/article/details/50851049 以JDBC-MySQL驅動包為例 1、在IntelliJ IDEA中打開要添加jar包的Project 2、File – Project Structure如下圖 3、選擇Moudules – 再選擇Dependencies如下圖 4、選中Moudule source – 然后點擊2處號…

Python3 與 C# 并發編程之~ 進程篇

上次說了很多Linux下進程相關知識,這邊不再復述,下面來說說Python的并發編程,如有錯誤歡迎提出~ 如果遇到聽不懂的可以看上一次的文章:https://www.cnblogs.com/dotnetcrazy/p/9363810.html 官方文檔:https…

11月12號 用戶登錄輸入密碼錯誤達到指定次數后,鎖定賬戶 004

用戶表里添加兩個屬性 連續密碼輸錯次數private Integer loginFailCount;/** 登錄失敗禁用時間 */ private Date missDate; / 如果登錄錯誤次數大于5次 規定時間內禁止登錄if(dbUser.getLoginFailCount() ! null && dbUser.getLoginFailCount() > 3){if(DateUtils.…

Goobuntu:谷歌的內部桌面系統

摘要:大多數Linux用戶都知道Google用Linux作為它們的桌面和服務器端操作系統,有的人可能還知道Google選擇的是定制的Ubuntu——Goobuntu,但在此之前幾乎沒有Google外部人員了解他們究竟是如何使用Ubuntu的,8月29日,Tho…

Springboot 之 Hibernate自動建表(Mysql)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 引入Maven依賴包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-…

Spring全家桶面試真題

文章目錄1. Spring Boot1.1 說說你對Spring Boot的理解1.2 Spring Boot Starter有什么用&#xff1f;1.3 介紹Spring Boot的啟動流程1.4 Spring Boot項目是如何導入包的&#xff1f;1.5 請描述Spring Boot自動裝配的過程1.6 說說你對Spring Boot注解的了解2. Spring2.1 請你說說…

WSDL測試webservice接口記錄

收到一個事情&#xff0c;需要對接第三方API&#xff0c;對方給了個service&#xff0c;看了一下&#xff0c;原來是webservices的。 上一次測試webervice的接口&#xff0c;還是至少八九年前的時候了&#xff0c;這種相對比較老舊的也好久不在使用。 于是&#xff0c;簡單搞了…

idea窗口下方滾動條不明顯設置

在使用idea時&#xff0c;下方的滾動條老是顯示不明顯&#xff0c;每次點擊拖拽都很費勁&#xff0c;在網上找了很多相關設置&#xff0c;最后確定了一個最好的辦法解決問題&#xff1a; Shift &#xff08;上檔&#xff09; 鼠標滾動&#xff0c;這樣就可以橫向翻滾了&#…

把握本質規律——《數學之美》作者吳軍

無論是互聯網&#xff0c;還是手機、電視&#xff0c;現代通信都遵循信息論的規律&#xff0c;整個信息論的基礎都是數學。搜索引擎、語音識別、機器翻譯也都是我們生活中離不開的技術&#xff0c;數學也是解決這些問題的最好工具。在《浪潮之巔》出版后&#xff0c;吳軍將蘊含…

Hibernate4 注解方法說明

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.類級別注解 Entity 映射實體類 Table 映射數句庫表 Entity(name"tableName") - 必須&#xff0c;注解將一個類聲明…

消息隊列常見面試題

文章目錄2. 消息隊列2.1 MQ有什么用&#xff1f;2.2 說一說生產者與消費者模式2.3 消息隊列如何保證順序消費&#xff1f;2.4 消息隊列如何保證消息不丟&#xff1f;2.5 消息隊列如何保證不重復消費&#xff1f;2.6 MQ處理消息失敗了怎么辦&#xff1f;2.7 請介紹消息隊列推和拉…