12種常用設計模式

2022-08-21 03:06:17 字數 3605 閱讀 5089

1.反射

(類名)class.forname(string 類路徑).newinstance();

類物件.getclass().newinstance()

類.class.newinstance()

如何防止被反射

2.六大原則

開閉原則ocp、黎克特制代換原則、依賴倒轉原則、迪公尺特法則、合成復用原則

行為型模式5(工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式)

建立型模式7(介面卡模式、裝飾器模式、**模式、外觀模式、橋接模式、組合模式、享元模式)

結構型模式11(策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式)

1.單例模式:

節約記憶體、重複利用、方便管理,但是有執行緒安全問題

五種建立方式:餓漢、懶漢、靜態內部類、列舉方式、雙重檢測鎖(會有重排序問題)

建構函式私有化、變數使用static修飾放永久區、懶漢式用synchronized達到執行緒安全(效率低)

如何防止單例被攻擊:在建構函式中做判斷,只能執行初始化一次,如果執行了兩次建構函式就報錯

private static boolean flag = false;

private singletondemo04() else

}工廠設計模式factory:

簡單工廠:動態使用快取或者資料庫+反射,實現,專案裡open_utils_service+!!動態**設計模式!!(不支援拓展增加產品)

2.工廠方法模式:即多個簡單工廠相結合(用來生產同一等級結構中的固定產品,車,不同牌子的車),支援拓展增加產品

3.抽象工廠:生產不同產品族群的全部產品(不僅是不同牌子的車,還有車的零件:椅子、發動機等的族群),支援增加產品族群,不支援拓展增加產品

4.**模式proxy :

靜態**:在**類的建構函式裡傳入本體類,呼叫其方法並加上自己的自定義需要執行的**

jdk動態**、cglib動態**(傳入的類可以不用是實現介面的)

jdk動態**只能對實現了介面的類生成**,而不能針對類 。

cglib是針對類實現**,主要是對指定的類生成乙個子類,覆蓋其中的方法 。

因為是繼承,所以該類或方法最好不要宣告成final ,final可以阻止繼承和多型

如果目標物件沒有實現了介面,必須採用cglib庫,spring會自動在jdk動態**和cglib之間轉換

5.建立者模式:

要建立的複雜物件product,包含所有建立方法的介面builder,concretebuilder實現此介面細化建立過程並返回建立的product,指導者director呼叫具體建造者來建立複雜物件的各個部分,不涉及具體產品的資訊,只負責保證物件各部分完整建立或按某種順序建立

相較於策略模式:把使用者那一步加進來了

使用場景: 1、需要生成的物件具有複雜的內部結構。 2、需要生成的物件內部屬性本身相互依賴。

6.模板方法:

定義乙個處理流程模板abstract,相似的不易變得的都放在此實現,將容易變的部分抽象出來,供子類實現,使得子類可以不改變乙個演算法的結構即可重定義該演算法的,使用者只要用子類呼叫流程方法就可以了

場景:處理某個流程的**已經都具備,但是其中某個節點的**暫時不能確定

實際使用:資料庫訪問的封裝、junit單元測試、servlet中關於doget/dopost方法的呼叫、hibernate中模板程式、spring中jdbctemplate,hibernatetemplate等等

7.介面卡模式:

介面卡繼承適配的類,建構函式中傳入被適配的類,並重寫方法函式中**,變為呼叫被適配的類的方法。即在執行中,沒有呼叫介面卡,則執行原本的方法,一旦呼叫了介面卡(繼承自原本方法),久會呼叫介面卡裡重寫的方法(被適配的類的方法),就是轉換。

使用案例:

outputstreamwriter:是writer的子類,將輸出的字元流變為位元組流,即:將乙個字元流的輸出物件變為位元組流的輸出物件。

inputstreamreader:是reader的子類,將輸入的位元組流變為字元流,即:將乙個位元組流的輸入物件變為字元流的輸入物件。

springmvc 介面卡

8.外觀模式:

結構型模式,向現有的系統新增乙個介面,來隱藏系統的複雜性

9.原型模式:

淺複製只是拷貝了基本型別的資料,而引用型別資料,複製後也是會發生引用(但string型別是final修飾,支援轉殖,複製後不會發生引用),淺複製僅僅是指向被複製的記憶體位址,如果原位址中物件被改變了,那麼淺複製出來的物件也會相應改變

深複製 —-在計算機中開闢了一塊新的記憶體位址用於存放複製的物件

10.裝飾模式decorator :

與**模式區別:裝飾模式,突出的是執行期增加行為,動態擴充套件物件的訪問;**是在**類中建立乙個物件的例項,控制使用者對物件的訪問,完全限制了使用者,更像是一種特殊定製;裝飾模式將原始物件作為引數傳遞給修飾類,可以很靈活的讓使用者感受到增強或著說裝飾了那些東西,就像io流一樣。就是**模式中要實現的點太多獨立變化,就可以考慮裝飾模式了(一人包乾和團體運作的區別吧)。

不論使用哪個模式,都可以很容易地在真實物件的方法前後加上自定義方法

實現的是同一介面,可以通過建構函式反覆修飾,加糖加鹽加油加醋,想先加那個後加哪個,想加那個再加哪個都可以,靈活的鴨皮

思考:如果不僅僅想在真是物件方法前後加上自定義呢?我想在中間加,該怎麼辦?

11.策略模式:

相較於模板模式,模板方法把流程定下來,使用什麼實現用子類去繼承重寫,使用者直接呼叫流程方法(即單繼承實現所有)。策略就是各個流程分開為多個抽象模板,每個抽象模板有多個實現策略,把單個流程模板放在乙個context類裡去自定義實現,呼叫者自己實現此流程,每個流程裡用哪個方法就是呼叫哪個策略

策略模式中乙個『策略』是乙個完整的演算法,流程中演算法可以自定義組合,但是模板模式中只能改變乙個或幾個特定的演算法(全都要改就沒必要用這個模式了)。演算法流程策略模式可以改變,模板模式也可以在子類中是實現改變

使用場景:多個變化點會獨立變化時,使用策略模式更優,多個變化點少數會獨立變化是,使用模組方法更優

12.觀察者模式:

目標和觀察者是基類,目標提供維護觀察者的一系列方法,觀察者提供更新介面

(將觀察者類註冊進觀察目標類,當目標資訊改變的時候,目標類迴圈註冊列表裡的觀察者的update()方法更新觀察者資料,即被動觀察到被觀察目標改變)

兩種實現方式:

推:每次都會把通知以廣播的方式傳送給所有觀察者,所有的觀察者只能被動接收

拉:觀察者只要知道有情況即可,至於什麼時候獲取內容,獲取什麼內容,都可以自主決定。

設計模式其中12種總結

1.簡單工廠 2.工廠方法 3.抽象工廠 4.介面卡 5.裝飾器 6.7.外觀 8.職責鏈 9.迭代器 10.中介者 11.觀察者 12.狀態 其實最開始是因為考試的,因為考試這次的範圍是12種設計模式,感覺這個大家會很吃力,想著大三下了,總結一下,幫助大家複習 但是一開始做,才發現不簡單,我發現了...

23種設計模式(12) 模版方法模式

定義 定義乙個操作中演算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變演算法的結構即可重定義該演算法中的某些特定步驟。型別 行為類模式 類圖 事實上,模版方法是程式設計中乙個經常用到的模式。先來看乙個例子,某日,程式設計師a拿到乙個任務 給定乙個整數陣列,把陣列中的數由小到大排序,然後把排序...

設計模式 1 2 工廠模式

工廠模式 乙個工廠專門用來產生a型號的單核,另乙個工廠專門用來生產b型號的單核。客戶要做的就是找好工廠,比如要a型號的核,就找a工廠要 否則找b工廠要,不再需要告訴工廠要什麼型號的處理器核了。工廠方法 定義建立物件的介面,讓子類決定例項化哪乙個類。工廠方法使類的例項化延遲到其子類。優點 增加新功能只...