創建型模式:關注對象的創建過程
1、單例模式:保證一個類只有一個實例,並且提供一個訪問該實例的全局訪問點
主要:
餓漢式(線程安全,調用效率高,但是不能延時加載)
懶漢式(線程安全,調用效率不高,但是可以延時加載)
其他:
雙重檢測鎖式(由於JVM底層內部模型原因,偶爾會出問題。不建議使用)
靜態內部類式(線程安全,調用效率高。但是可以延時加載)
枚舉單例(線程安全,調用效率高,不能延時加載)
2、工廠模式:
簡單工廠模式:用來生產同一等級結構中的任意產品(對已有產品新增功能,需要修改源代碼)
雖然能通過工廠來創建對象,但是違反了開閉原則。一旦增加功能需要在原有基礎上修改代碼。
工廠方法模式:用來生產同一等級結構中的固定產品(支持增加任意產品,不用修改源代碼)
將工廠類調整為工廠接口,需要什么類型的工廠就使用該類實現該工廠,創建相應的產品。
抽象工廠模式:
3、抽象工廠模式:用來生產不同產品族的全部產品(對於增加新的產品,無能為力。可增加一系列的產品族)
抽象工廠模式用來生產不同產品族的全部產品,對於只增加產品某一部分則不適用。抽象工廠模式是工廠模式的一種升級版本。
4、建造者模式:分離了對象子組件的單獨構造(由Builder來負責構建,由Director來負責組裝),從而可以構造出復雜的對象。
假如一個對象的構建很復雜,需要很多步驟。如果使用了建造者模式,會將其構建對象,和組裝成一個對象這兩步給分開來
構建部分為(builder)和組織部分(director),實現了構建和裝配的解耦。
5、原型模式:通過new產生一個對象需要非常繁瑣的數據准備或訪問權限,則可以使用原型模式。
所謂原型模式就是構建一個對象的原型,通過原型來創建出新的對象。
行為型模式:關注系統中對象之間的相互交互,研究系統在運行時對象之間的相互通信和協作,進一步明確對象的職責。
6、模板方法模式:定義一個操作中的算法骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的
某些特定步驟。也就是說:假如某些操作代碼基本相同,只是其中一部分會經常改變,則可以使用模板方法,將不變的部分作為一個模板,將容易變動的
部分讓子類來實現。
7、命令模式(不常用):將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化,對請求排隊或記錄請求日志。以及支持可撤銷的操作。說白了,就是將一系列的請求命令封裝起來,不直接調用真正執行者的方法,這樣比較好擴展。
8、迭代器模式:提供一種方法順序的訪問一個聚合對象中各個元素,而又不暴露該對象的內部表示。也就是開發一個用於迭代某個對象中元素的功能。
一般我們開發時很少自己開發,因為jdk內置了迭代器。
9、觀察者模式:也叫(發布-訂閱模式)定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象,這個主題對象在狀態發生變化時,會通知所有觀察者對象。使它們能夠自動更新自己。例如:發廣播,游戲中大喇叭,群聊
jdk中提供了抽象主題和抽象觀察者的接口,我們可以使用這兩個接口來方便的定義自己的觀察者模式
10、中介者模式:用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯示地相互引用。從而使其耦合松散,而且可以獨立地改變它們之間的交互。中介者模式核心:1.就是將網狀結構處理成星型結構 2.將多對多處理成一對多
11、備忘錄模式:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以后就可將該對象恢復到原先保存的狀態。
也就是說,不破壞源數據的情況下,將源數據進行一次或者多次的備份。
12、解釋器模式(不常用):給定一個語言,定義它的文法一種表示。並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
13、狀態模式:當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類
狀態模式主要解決的是當控制一個對象狀態轉換的條件表達式過於復雜時的情況。當遇到不同的狀態遇到不同的行為的時候,可以使用狀態模式
例如:酒店房間的狀態,是空閑,預定,還是已入住呢?而且這三種狀態都對應着不同的行為,空閑的話就可預定,可預定的話就可入住,已入住的話
就不能顯示空閑。
14、策略模式:它定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化不會影響到使用算法的客戶。
例如:商場中的打折商品,針對不同的客戶可能有不同的折扣。那這些算法該怎么定義呢?可以使用策略模式,給每個會員或者商品都指定一個特定的算法,根據不同的算法,打不同的折扣。
15、職責鏈模式:將能夠處理同一類請求的對象連成一條鏈,使這些對象都有機會處理請求,所提交的請求沿着鏈傳遞。從而避免請求的
發送者和接受者之間的耦合關系。鏈上的對象逐個判斷是否有能力處理該請求,如果能則就處理,如果不能,則傳給鏈上的下一個對象。
直到有一個對象處理它為止。比如:請假申請,審批人連成一條鏈,每個人都有機會處理這個假條,但是這個請假申請最終肯定會經過審核(不管審批是否通過)。
16、訪問者模式(不常用):表示一個作用於某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。
結構型模式:關注對象和類的組織
17、適配器模式:將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由於接口不兼容而不能一起工作的類可以一起工作。
例如:NBA中的球員來自不同國家,而世界標准語言是英語。那他們不會英語,也不能各自學習所有國家的語言。所以,最好的辦法就是請不同的翻譯
將這些球員國家的語言翻譯成英語。而這些翻譯就是適配器!!
適配器模式分類:
1、類適配器模式(不推薦使用):由於類適配器模式需要多重繼承對一個接口對另一個接口進行適配,而C#,Java不支持多重繼承。
2、對象適配器模式:采用組合的方式
18、橋接模式:將抽象部分與它的實現部分分離,使它們都可以獨立的變化。而不會直接影響到其他部分。橋接模式解決了多層繼承的結構,處理多維度變化的場景,將各個維度設計成獨立的繼承結構。使各個維度可以獨立的擴展在抽象層建立聯系。
19、裝飾模式:也叫裝飾者模式或者裝飾器模式,表示動態的給一個對象添加一些新的功能(利用子類繼承父類也可以實現),但是比生成子類方式更靈活。例如:我們每個人身上穿的衣服,鞋子,領帶,披風都可以理解為是對人的裝飾。
20、組合模式:將對象組合成樹形結構以表示:部分--整體 的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。基本上見到的樹形結構都使用到了組合模式。
21、外觀模式:為子系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口。這個接口使得這一子系統更加容易使用。遵守迪米特法則(最少知識原則)。說白了,就可以理解為封裝。外觀模式的核心:為子系統提供統一的入口,封裝子系統的復雜性,便於客戶端調用
22、享元模式:運用共享技術有效的支持大量細粒度對象的重用。它能做到共享的關鍵就是區分了內部狀態(可以共享,不會隨環境變化而變化)和外部狀態(不可以共享,會隨環境變化而變化)。如果項目中有很多完全相同或相似的對象,則可以使用享元模式,節省內存。
23、代理模式:為其他對象提供一種代理以便控制對這個對象的訪問。
可以詳細控制訪問某個類(對象)的方法,在調用這個方法前作的前置處理(統一的流程代碼放到代理中處理)。調用這個方法后做后置處理。
例如:明星的經紀人,租房的中介等等都是代理
代理模式分類:
1.靜態代理(靜態定義代理類,我們自己靜態定義的代理類。比如我們自己定義一個明星的經紀人類)
2.動態代理(通過程序動態生成代理類,該代理類不是我們自己定義的。而是由程序自動生成)比較重要!!
參考資料:
大話設計模式(帶目錄完整版).pdf
HEAD_FIRST設計模式(中文版).pdf
尚學堂_高淇_java300集最全視頻教程_【GOF23設計模式】