以下文章來源于公眾號“程序員求職之路”
設(shè)計模式是人們在面對同類型軟件工程設(shè)計問題所總結(jié)出的一些有用的經(jīng)驗锅劝。
模式不是代碼,而是某類問題的通用設(shè)計解決方案间聊。這篇文章以面試問答的角度帶你了解設(shè)計模式這塊知識笆焰。
1蓬豁、請列舉出在 JDK 中幾個常用的設(shè)計模式谆奥?
①單例模式(Singleton pattern)用于 Runtime眼坏,Calendar 和其他的一些類中;
②工廠模式(Factory pattern)被用于各種不可變的類如Boolean酸些,像Boolean.valueOf宰译;
③觀察者模式(Observer pattern)被用于 Swing 和很多的事件監(jiān)聽中;
④裝飾器設(shè)計模式(Decorator design pattern)被用于多個 Java IO 類中擂仍。
2囤屹、什么是設(shè)計模式???
設(shè)計模式是世界上各種各樣程序員用來解決特定設(shè)計問題的嘗試和測試的方法逢渔。設(shè)計模式是代碼可用性的延伸。
3乡括、Java 中什么叫單例設(shè)計模式肃廓?請用 Java 寫出線程安全的單例模式
單例模式重點在于在整個系統(tǒng)上共享一些創(chuàng)建時較耗資源的對象。整個應(yīng)用中只維護(hù)一個特定類實例诲泌,它被所有組件共同使用盲赊。
Java.lang.Runtime 是單例模式的經(jīng)典例子。從 Java5開始你可以使用枚舉(enum)來實現(xiàn)線程安全的單例敷扫。
4哀蘑、在Java中,什么叫觀察者設(shè)計模式(observer design pattern)葵第?
觀察者模式是定義對象間的一種一對多依賴關(guān)系绘迁,使得每當(dāng)一個對象狀態(tài)發(fā)生改變時,其相關(guān)依賴對象皆得到通知并被自動更新卒密。
觀察者模式又叫做發(fā)布-訂閱(Publish/Subscribe)模式缀台、模型-視圖(Model/View)模式、源-監(jiān)聽器(Source/Listener)模式或從屬者(Dependents)模式哮奇。
5膛腐、使用工廠模式最主要的好處是什么?在哪里使用鼎俘?
工廠模式的最大好處是增加了創(chuàng)建對象時的封裝層次哲身。如果你使用工廠來創(chuàng)建對象,之后你可以使用更高級和更高性能的實現(xiàn)來替換原始的產(chǎn)品實現(xiàn)或類贸伐,這不需要在調(diào)用層做任何修改勘天。?
6、什么是適配器模式?
適配器模式是將一個類的接口變成客戶端所期望的另一種接口误辑,從而使原本因接口不匹配而無法一起工作的兩個類能夠在一起工作沧踏。
優(yōu)點:
可以讓兩個沒有關(guān)聯(lián)的類一起運行,起著中間轉(zhuǎn)換的作用巾钉;
靈活性好翘狱,不會破壞原有的系統(tǒng)。
缺點:
過多地使用適配器砰苍,容易使代碼結(jié)構(gòu)混亂潦匈,如明明看到調(diào)用的是 A 接口,內(nèi)部調(diào)用的卻是 B 接口的實現(xiàn)赚导。
以生活中的例子來說茬缩,比如有一個充電器是 MicroUSB 接口,而手機充電口卻是 TypeC 的吼旧,這個時候就需要一個把 MicroUSB 轉(zhuǎn)換成 TypeC 的適配器凰锡。
7、在Java中圈暗,為什么不允許從靜態(tài)方法中訪問非靜態(tài)變量掂为?
Java 中不能從靜態(tài)上下文訪問非靜態(tài)數(shù)據(jù)只是因為非靜態(tài)變量是跟具體的 對象實例關(guān)聯(lián)的,而靜態(tài)的卻沒有和任何實例關(guān)聯(lián)员串。
8勇哗、Spring 中都使用了哪些設(shè)計模式?
Spring 框架使用的設(shè)計模式如下寸齐。
代理模式:在 AOP 中有使用
單例模式:bean 默認(rèn)是單例模式
模板方法模式:jdbcTemplate
工廠模式:BeanFactory
觀察者模式:Spring 事件驅(qū)動模型就是觀察者模式很經(jīng)典的一個應(yīng)用欲诺,比如,ContextStartedEvent 就是 ApplicationContext 啟動后觸發(fā)的事件
適配器模式:Spring MVC 中也是用到了適配器模式適配 Controller
9渺鹦、在 Java 中扰法,什么時候用重載,什么時候用重寫海铆?
如果你看到一個類的不同實現(xiàn)有著不同的方式來做同一件事迹恐,那么就應(yīng)該用 34 重寫(overriding),而重載(overloading)是用不同的輸入做同一件事卧斟。在 Java 中殴边,重載的方法簽名不同,而重寫并不是珍语。?
10锤岸、IO 使用了什么設(shè)計模式?
IO 使用了適配器模式和裝飾器模式板乙。
適配器模式:由于 InputStream 是字節(jié)流不能享受到字符流讀取字符那么便捷的功能是偷,借助 InputStreamReader 將其轉(zhuǎn)為 Reader 子類拳氢,因而可以擁有便捷操作文本文件方法;
裝飾器模式:將 InputStream 字節(jié)流包裝為其他流的過程就是裝飾器模式蛋铆,比如馋评,包裝為 FileInputStream、ByteArrayInputStream刺啦、PipedInputStream 等留特。
懂你所想、知你所需玛瘸,后臺回復(fù)「面試題庫」蜕青,做足功課為自己的面試交出滿意答卷吧。
更多內(nèi)容也請關(guān)注
程序員求職之路
一個為程序員量身定做的求職公眾號
給你貼心有效的大廠面試真題
面試干貨糊渊、職業(yè)發(fā)展干貨右核、簡歷模版