java常用设计模式及其使用场景
設計模式的使用場景。
設計模式分為?3?大類型共?23?種:
創建型:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
結構型:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
行為型:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。
?
最常見的設計模式有:單例模式、工廠模式、代理模式、構造者模式、責任鏈模式、適配器模式、觀察者模式等
?
面試中對于設計模式,你應該明白不同的設計用來解決什么場景問題,對于常用的設計模式能夠靈活運用。下面重點介紹幾種常用的設計模式。
?
單例模式
首先是單例模式,這個模式在實際業務中會經常用到,也是設計模式中的主要考察點。這里介紹線程安全的單例模式實現方式。
單例模式常見的實現方式有三種。
第一種是靜態初始化方式,也叫作餓漢方式。實現的思路就是在類初始化時完成單例實例的創建,因此不會產生并發問題,在這種方式下不管是否會使用到這個單例,都會創建這個單例。
第二種實現方式是雙重檢查,也叫作懶漢方式,只有在真正用到這個單例實例的時候才會去創建,如果沒有使用就不會創建。這個方式必然會面對多個線程同時使用實例時的并發問題。為了解決并發訪問問題,通過?synchronized?或者?lock?進行雙重檢查,保證只有一個線程能夠創建實例。這里要注意內存可見性引起的并發問題,必須使用?volatile?關鍵字修飾單例變量。
第三種是單例注冊表方式,Spring?中?Bean?的單例模式就是通過單例注冊表方式實現的。
下面結合設計模式的實際應用,來介紹常用的設計模式,在面試時遇到類似問題,記得要將設計模式與實際業務場景進行結合,來體現對設計模式的理解和應用能力。
?
? ???? ? ?
?
?
工廠模式
工廠模式是創建不同類型實例時常用的方式,例如?Spring?中的各種?Bean?是有不同?Bean?工廠類進行創建的。
?
代理模式
代理模式,主要用在不適合或者不能直接引用另一個對象的場景,可以通過代理模式對被代理對象的訪問行為進行控制。Java?的代理模式分為靜態代理和動態代理。靜態代理指在編譯時就已經創建好了代理類,例如在源代碼中編寫的類;動態代理指在?JVM?運行過程中動態創建的代理類,使用動態代理的方法有?JDK?動態代理、CGLIB、Javassist?等。面試時遇到這個問題可以舉個動態代理的例子,比如在?Motan RPC?中,是使用?JDK?的動態代理,通過反射把遠程請求進行封裝,使服務看上去就像在使用本地的方法。
?
責任鏈模式
責任鏈模式有點像工廠的流水線,鏈上每一個節點完成對對象的某一種處理,例如?Netty?框架在處理消息時使用的?Pipeline?就是一種責任鏈模式。
?
適配器模式
適配器模式,類似于我們常見的轉接頭,把兩種不匹配的對象來進行適配,也可以起到對兩個不同的對象進行解藕的作用。例如我們常用的日志處理框架?SLF4J,如果我們使用了?SLF4J?就可以跟?Log4j?或者?Logback?等具體的日志實現框架進行解藕。通過不同適配器將?SLF4J?與?Log4j?等實現框架進行適配,完成日志功能的使用。
?
觀察者模式
觀察者模式也被稱作發布訂閱模式,適用于一個對象的某個行為需要觸發一系列事件的場景,例如?gRPC?中的?Stream?流式請求的處理就是通過觀察者模式實現的。
?
構造者模式
構造者模式,適用于一個對象有很多復雜的屬性,需要根據不同情況創建不同的具體對象,例如創建一個?PB?對象時使用的?builder?方式。
?
Java?語言特性知識點
Java?語言特性的知識點匯總如下
?
?? ? ???? ? ?
?
常用集合類實現與?Java?并發工具包?JUC?是常見考點,JUC?會在后面的多線程課程中進行詳細講解。
Java?的集合類中部分需要重點了解類的實現。例如,HashMap、TreeMap?是如何實現的等。
動態代理與反射是?Java?語言的特色,需要掌握動態代理與反射的使用場景,例如在?ORM?框架中會大量使用代理類。而?RPC?調用時會使用到反射機制調用實現類方法。
Java?基礎數據類型也常常會在面試中被問到,例如各種數據類型占用多大的內存空間、數據類型的自動轉型與強制轉型、基礎數據類型與?wrapper?數據類型的自動裝箱與拆箱等。
Java?對對象的引用分為強引用、軟引用、弱引用、虛引用四種,這些引用在?GC?時的處理策略不同,強引用不會被?GC?回收;軟引用內存空間不足時會被?GC?回收;弱引用則在每次?GC?時被回收;虛引用必須和引用隊列聯合使用,主要用于跟蹤一個對象被垃圾回收的過程。
Java?的異常處理機制就是?try-catch-finally?機制,需要知道異常時在?try catch?中的處理流程;需要了解?Error?和?Exception?的區別。
最后?Java?的注解機制和?SPI?擴展機制可以作為擴展點適當了解。
?
詳解?Map
關于?Java?的基礎知識重點講解最常考察點?HashMap?和?ConcurrentHashMap,以及?Java?的不同版本新技術特性
?
?? ? ???? ? ?
?
面試中,Map?的實現這個題目能夠考察到數據結構、Java?基礎實現以及對并發問題處理思路的掌握程度。
?
HashMap
先來看?HashMap?的實現,簡單來說,Java?的?HashMap?就是數組加鏈表實現的,數組中的每一項是一個鏈表。通過計算存入對象的?HashCode,來計算對象在數組中要存入的位置,用鏈表來解決散列沖突,鏈表中的節點存儲的是鍵值對。
除了實現的方式,我們還需要知道填充因子的作用與?Map?擴容時的?rehash?機制,需要知道?HashMap?的容量都是?2?的冪次方,是因為可以通過按位與操作來計算余數,比求模要快。另外需要知道?HashMap?是非線程安全的,在多線程?put?的情況下,有可能在容量超過填充因子時進行?rehash,因為?HashMap?為了避免尾部遍歷,在鏈表插入元素時使用頭插法,多線程的場景下有可能會產生死循環。
ConcurrentHashMap????
從?HashMap?的非線程安全,面試官很自然地就會問到線程安全的?ConcurrentHashMap。ConcurrentHashMap?采用分段鎖的思想來降低并發場景下的鎖定發生頻率,在?JDK1.7?與?1.8?中的實現差異非常大,1.7?中使用?Segment?進行分段加鎖,降低并發鎖定;1.8?中使用?CAS?自旋鎖的樂觀鎖來提高性能,但是在并發度較高時性能會比較一般。另外?1.8?中的?ConcurrentHashMap?引入了紅黑樹來解決?Hash?沖突時鏈表順序查找的問題。紅黑樹的啟用條件與鏈表的長度和?Map?的總容量有關,默認是鏈表大于?8?且容量大于?64?時轉為紅黑樹。這部分內容建議詳細閱讀源碼進行學習。
?
詳解 Java 版本特性
? ? ? ? ? ? ?
?
?
Java?近些年一改以往的版本發布風格,發布頻率提高了很多。目前大部分公司的生產環境使用的還是?1.8?版本,一少部分升級到?1.9?或?1.10 版本,Java?的?1.8?版本是一個長期支持的版本,最新發布的?1.11?版本也是一個長期支持的版本,1.11?版本中已經包含了?1.9、1.10 版本的功能,所以?1.8?和?1.11?版本是我們要重點關注的版本。
在?1.8?版本中?Java?增加了對?lambda?表達式的支持,使?Java?代碼的編寫可以更簡潔,也更方便支持并行計算。并且提供了很多?Stream?流式處理的?API。1.8?版本還支持了方法引用的能力,可以進一步簡化?lambda?表達式的寫法。
在?1.8?版本中,接口可以提供默認方法了,這樣可以簡化一些簡單的抽象類。最后在?1.8?版本中對方法區進行調整,使用?Metaspace?替換掉了?PermGen?的永久代。Metaspace?與?PermGen?之間最大的區別在于:Metaspace?并不在虛擬機中,而是使用本地內存。替換的目的一方面是可以提升對元數據的管理同時提升?GC?效率,另一方面是方便后續?HotSpot?與?JRockit?合并
在?1.9、1.10?版本中的主要特性是增加了模塊系統,將?G1?設為默認垃圾回收器、支持局部變量推斷等功能。這些功能都已經包含在?1.11?版本中。
1.11?版本是?Java?最新的長期支持版本,也將會是未來一段時間的主要版本,1.11?版本中提供的最激動人心的功能是?ZGC?這個新的垃圾回收器,ZGC?為大內存堆設計,有著非常強悍的性能,能夠實現?10ms?以下的?GC?暫停時間。關于?ZGC?會在下一課中進一步介紹。除此之外,1.11?版本對字符串處理?API?進行了增強,提供了字符復制等功能。1.11?版本還內置了?HttpClient。
總結
以上是生活随笔為你收集整理的java常用设计模式及其使用场景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DOxygen for C++使用说明—
- 下一篇: asp.net ajax控件工具集 Au