設計模式前端
這篇總結主要是基於我設計模式系列的文章而造成的的。主要是把重要的知識點用本身的話說了一遍,可能會有一些錯誤,還望見諒和指點。謝謝python
更多詳細內容能夠到個人cdsn博客上查看: https://blog.csdn.net/a724888程序員
最後,若是想要更好地完成這部份內容的學習,建議你們仍是去看一下原文。面試
建立型模式算法
建立型模式 建立型模式的做用就是建立對象,說到建立一個對象,最熟悉的就是 new 一個對象,而後 set 相關屬性。可是,在不少場景下,咱們須要給客戶端提供更加友好的建立對象的方式,尤爲是那種咱們定義了類,可是須要提供給其餘開發者用的時候。數據庫
單例編程
單例模式保證全局的單例類只有一個實例,這樣的話使用的時候直接獲取便可,好比數據庫的一個鏈接,Spring裏的bean,均可以是單例的。
後端
單例模式通常有5種寫法。
設計模式
第一種是餓漢模式,先把單例進行實例化,獲取的時候經過靜態方法直接獲取便可。缺點是類加載後就完成了類的實例化,浪費部分空間。
微信
第二種是飽漢模式,先把單例置爲null,而後經過靜態方法獲取單例時再進行實例化,可是可能有多線程同時進行實例化,會出現併發問題。
第三種是逐步改進的方法,一開始能夠用synchronized關鍵字進行同步,可是開銷太大,然後改爲使用volatile修飾單例,而後經過一次檢查判斷單例是否已初始化,若是未初始化就使用synchronized代碼塊,再次檢查單例防止在這期間被初始化,然後才真正進行初始化。
第四種是使用靜態內部類來實現,靜態內部類只在被使用的時候才進行初始化,因此在內部類中進行單例的實例化,只有用到的時候纔會運行實例化代碼。而後外部類再經過靜態方法返回靜態內部類的單例便可。
第五種是枚舉類,枚舉類的底層實現其實也是內部類。枚舉類確保每一個類對象在全局是惟一的。因此保證它是單例,這個方法是最簡單的。
工廠模式
簡單工廠通常是用一個工廠建立多個類的實例。
工廠模式通常是指一個工廠服務一個接口,爲這個接口的實現類進行實例化
抽象工廠模式是指一個工廠服務於一個產品族,一個產品族可能包含多個接口,接口又會包含多個實現類,經過一個工廠就能夠把這些綁定在一塊兒,很是方便。
原型模式
通常經過一個實例進行克隆從而得到更多同一原型的實例。使用實例的clone方法便可完成。
建造者模式
建造者模式中有一個概念叫作鏈式調用,鏈式調用爲一個類的實例化提供便利,通常提供系列的方法進行實例化,實際上就是將set方法改造一下,將本來返回爲空的set方法改成返回this實例,從而實現鏈式調用。
建造者模式在此基礎上加入了builder方法,提供給外部進行調用,一樣使用鏈式調用來完成參數注入。
結構型模式
結構型模式
前面建立型模式介紹了建立對象的一些設計模式。
這節介紹的結構型模式旨在經過改變代碼結構來達到解耦的目的,使得咱們的代碼容易維護和擴展。
橋接模式
有點複雜。建議參考原文
適配器模式
適配器模式用於將兩個不一樣的類進行適配。
適配器模式和代理模式的異同
比較這兩種模式,實際上是比較對象適配器模式和代理模式,在代碼結構上,
它們很類似,都須要一個具體的實現類的實例。
可是它們的目的不同,代理模式作的是加強原方法的活;
適配器作的是適配的活,爲的是提供「把雞包裝成鴨,而後當作鴨來使用」,
而雞和鴨它們之間本來沒有繼承關係。
適配器模式能夠分爲類適配器,對象適配器等。
類適配器經過繼承父類就能夠把本身適配成父類了。
而對象適配器則須要把對象傳入另外一個對象的構造方法中,以便進行包裝。
享元模式
享元模式的核心在於享元工廠類,
享元工廠類的做用在於提供一個用於存儲享元對象的享元池,
用戶須要對象時,首先從享元池中獲取,
若是享元池中不存在,則建立一個新的享元對象返回給用戶,
在享元池中保存該新增對象。
代理模式
咱們發現沒有,代理模式說白了就是作 「方法包裝」 或作 「方法加強」。
在面向切面編程中,算了仍是不要吹捧這個名詞了,在 AOP 中,
其實就是動態代理的過程。好比 Spring 中,
咱們本身不定義代理類,可是 Spring 會幫咱們動態來定義代理,
而後把咱們定義在 @Before、@After、@Around 中的代碼邏輯動態添加到代理中。
外觀模式
外觀模式通常封裝具體的實現細節,爲用戶提供一個更加簡單的接口。
經過一個方法調用就能夠獲取須要的內容。
組合模式
組合模式用於表示具備層次結構的數據,使得咱們對單個對象和組合對象的訪問具備一致性。
直接看一個例子吧,每一個員工都有姓名、部門、薪水這些屬性,
同時還有下屬員工集合(雖然可能集合爲空),
而下屬員工和本身的結構是同樣的,
也有姓名、部門這些屬性,
同時也有他們的下屬員工集合。
class Employee {
private String name;
private String dept;
private int salary;
private List<Employee> subordinates; // 下屬
}
裝飾者模式
裝飾者
裝飾者模式把每一個加強類都繼承最高級父類。而後須要功能加強時把類實例傳入加強類便可,而後加強類在使用時就能夠加強原有類的功能了。
和代理模式不一樣的是,裝飾者模式每一個裝飾類都繼承父類,而且能夠進行多級封裝。
行爲型模式
行爲型模式
行爲型模式關注的是各個類之間的相互做用,將職責劃分清楚,使得咱們的代碼更加地清晰。
策略模式
策略模式通常把一個策略做爲一個類,而且在須要指定策略的時候傳入實例,因而咱們能夠在須要使用算法的地方傳入指定算法。
命令模式
命令模式通常分爲命令發起者,命令以及命令接受者三個角色。
命令發起者在使用時須要注入命令實例。而後執行命令調用。
命令調用實際上會調用命令接收者的方法進行實際調用。
好比遙控器按鈕至關於一條命令,點擊按鈕時命令運行,自動調用電視機提供的方法便可。
模板方法模式
模板方法通常指提供了一個方法模板,而且其中有部分實現類和部分抽象類,而且規定了執行順序。
實現類是模板提供好的方法。而抽象類則須要用戶自行實現。
模板方法規定了一個模板中方法的執行順序,很是適合一些開發框架,因而模板方法也普遍運用在開源框架中。
觀察者模式和事件監聽機制
觀察者模式通常用於訂閱者和消息發佈者之間的數據訂閱。
通常分爲觀察者和主題,觀察者訂閱主題,把實例註冊到主題維護的觀察者列表上。
而主題更新數據時自動把數據推給觀察者或者通知觀察者數據已經更新。
可是因爲這樣的方式消息推送耦合關係比較緊。而且很難在不打開數據的狀況下知道數據類型是什麼。
知道後來爲了使數據格式更加靈活,使用了事件和事件監聽器的模式,事件包裝的事件類型和事件數據,從主題和觀察者中解耦。
主題當事件發生時,觸發該事件的全部監聽器,把該事件經過監聽器列表發給每一個監聽器,監聽獲得事件之後,首先根據本身支持處理的事件類型中找到對應的事件處理器,再用處理器處理對應事件。
責任鏈模式
責任鏈一般須要先創建一個單向鏈表,而後調用方只須要調用頭部節點就能夠了,後面會自動流轉下去。
好比流程審批就是一個很好的例子,只要終端用戶提交申請,根據申請的內容信息,自動創建一條責任鏈,而後就能夠開始流轉了。
微信公衆號
我的公衆號:黃小斜
黃小斜是跨考軟件工程的 985 碩士,自學 Java 兩年,拿到了 BAT 等近十家大廠 offer,從技術小白成長爲阿里工程師。
做者專一於 JAVA 後端技術棧,熱衷於分享程序員乾貨、學習經驗、求職心得和程序人生,目前黃小斜的CSDN博客有百萬+訪問量,知乎粉絲2W+,全網已有10W+讀者。
黃小斜是一個斜槓青年,堅持學習和寫做,相信終身學習的力量,但願和更多的程序員交朋友,一塊兒進步和成長!
原創電子書: 關注公衆號【黃小斜】後回覆【原創電子書】便可領取我原創的電子書《菜鳥程序員修煉手冊:從技術小白到阿里巴巴Java工程師》
程序員3T技術學習資源: 一些程序員學習技術的資源大禮包,關注公衆號後,後臺回覆關鍵字 「資料」 便可免費無套路獲取。
考研複習資料: 計算機考研大禮包,都是我本身考研複習時用的一些複習資料,包括公共課和專業的複習視頻,這裏也推薦給你們,關注公衆號後,後臺回覆關鍵字 「考研」 便可免費獲取。
技術公衆號:Java技術江湖
若是你們想要實時關注我更新的文章以及分享的乾貨的話,能夠關注個人公衆號【Java技術江湖】一位阿里 Java 工程師的技術小站,做者黃小斜,專一 Java 相關技術:SSM、SpringBoot、MySQL、分佈式、中間件、集羣、Linux、網絡、多線程,偶爾講點Docker、ELK,同時也分享技術乾貨和學習經驗,致力於Java全棧開發!
Java工程師必備學習資源: 一些Java工程師經常使用學習資源,關注公衆號後,後臺回覆關鍵字 「Java」 便可免費無套路獲取。
個人公衆號
黃小斜是 985 碩士,阿里巴巴Java工程師,在自學編程、技術求職、Java學習等方面有豐富經驗和獨到看法,但願幫助到更多想要從事互聯網行業的程序員們。
做者專一於 JAVA 後端技術棧,熱衷於分享程序員乾貨、學習經驗、求職心得,以及自學編程和Java技術棧的相關乾貨。
黃小斜是一個斜槓青年,堅持學習和寫做,相信終身學習的力量,但願和更多的程序員交朋友,一塊兒進步和成長!
原創電子書:
關注微信公衆號【程序員黃小斜】後回覆【原創電子書】便可領取我原創的電子書《菜鳥程序員修煉手冊:從技術小白到阿里巴巴Java工程師》這份電子書總結了我2年的Java學習之路,包括學習方法、技術總結、求職經驗和麪試技巧等內容,已經幫助不少的程序員拿到了心儀的offer!
英雄不問出處,編程不看出身。這裏是自學編程愛好者的彙集地,也是程序員IT學習資源的藏經閣。點擊關注,一塊兒成爲更優秀的程序員!
程序員3T技術學習資源: 一些程序員學習技術的資源大禮包,關注公衆號【程序員江湖】後,後臺回覆關鍵字 「資料」 便可免費無套路獲取,包括Java、python、C++、大數據、機器學習、前端、移動端等方向的技術資料。
關注公衆號【程序員江湖】後回覆「Java」、「Python」、「C++」、「大數據」、「算法」、「AI」、「Android」、「前端」、「iOS」、「BAT」、「校招」、「筆試」、「面試」、「計算機基礎」、「LeetCode」 等關鍵字能夠獲取對應的免費程序員學習資料。