常用的設計模式

2021-10-09 08:16:31 字數 3383 閱讀 4412

常見的設計模式介紹:

單例模式

意圖:保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。

主要解決:乙個全域性使用的類頻繁地建立與銷毀。

何時使用:當您想控制例項數目,節省系統資源的時候。

如何解決:判斷系統是否已經有這個單例,如果有則返回,如果沒有則建立。

關鍵**:建構函式是私有的。

應用例項: 

1.外部資源:每台計算機有若干個印表機,但只能有乙個printerspooler,以避免兩個列印作業同時輸出到印表機。內部資源:大多數軟體都有乙個(或多個)屬性檔案存放系統配置,這樣的系統應該有乙個物件管理這些屬性檔案 

2. windows的taskmanager(任務管理器)就是很典型的單例模式(這個很熟悉吧),想想看,是不是呢,你能開啟兩個windows task manager嗎? 不信你自己試試看哦~ 

3. windows的recycle bin(**站)也是典型的單例應用。在整個系統執行過程中,**站一直維護著僅有的乙個例項。 

4. **的計數器,一般也是採用單例模式實現,否則難以同步。 

5. 應用程式的日誌應用,一般都何用單例模式實現,這一般是由於共享的日誌檔案一直處於開啟狀態,因為只能有乙個例項去操作,否則內容不好追加。 

6. web應用的配置物件的讀取,一般也應用單例模式,這個是由於配置檔案是共享的資源。 

7. 資料庫連線池的設計一般也是採用單例模式,因為資料庫連線是一種資料庫資源。資料庫軟體系統中使用資料庫連線池,主要是節省開啟或者關閉資料庫連線所引起的效率損耗,這種效率上的損耗還是非常昂貴的,因為何用單例模式來維護,就可以大大降低這種損耗。 

8. 多執行緒的執行緒池的設計一般也是採用單例模式,這是由於執行緒池要方便對池中的執行緒進行控制。 

9. 作業系統的檔案系統,也是大的單例模式實現的具體例子,乙個作業系統只能有乙個檔案系統。 。

優點: 1、在記憶體裡只有乙個例項,減少了記憶體的開銷,尤其是頻繁的建立和銷毀例項(比如管理學院首頁頁面快取)。 2、避免對資源的多重占用(比如寫檔案操作)。

缺點:沒有介面,不能繼承,與單一職責原則衝突,乙個類應該只關心內部邏輯,而不關心外面怎麼樣來例項化。

使用場景: 1、要求生產唯一序列號。 2、web 中的計數器,不用每次重新整理都在資料庫裡加一次,用單例先快取起來。 3、建立的乙個物件需要消耗的資源過多,比如 i/o 與資料庫的連線等。

注意事項:getinstance() 方法中需要使用同步鎖 synchronized (singleton.class) 防止多執行緒同時進入造成 instance 被多次例項化。

2、工廠模式

在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用乙個共同的介面來指向新建立的物件。

意圖:定義乙個建立物件的介面,讓其子類自己決定例項化哪乙個工廠類,工廠模式使其建立過程延遲到子類進行。

主要解決:主要解決介面選擇的問題。

何時使用:我們明確地計畫不同條件下建立不同例項時。

如何解決:讓其子類實現工廠介面,返回的也是乙個抽象的產品。

關鍵**:建立過程在其子類執行。

3、抽象工廠模式

抽象工廠模式(abstract factory pattern)是圍繞乙個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

在抽象工廠模式中,介面是負責建立乙個相關物件的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供物件。

主要解決:主要解決介面選擇的問題。

何時使用:系統的產品有多於乙個的產品族,而系統只消費其中某一族的產品。

如何解決:在乙個產品族裡面,定義多個產品。

關鍵**:在乙個工廠裡聚合多個同類產品。

4、觀察者模式

當物件間存在一對多關係時,則使用觀察者模式(observer pattern)。比如,當乙個物件被修改時,則會自動通知它的依賴物件。觀察者模式屬於行為型模式。

意圖:定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。

主要解決:乙個物件狀態改變給其他物件通知的問題,而且要考慮到易用和低耦合,保證高度的協作。

何時使用:乙個物件(目標物件)的狀態發生改變,所有的依賴物件(觀察者物件)都將得到通知,進行廣播通知。

如何解決:使用物件導向技術,可以將這種依賴關係弱化。

關鍵**:在抽象類裡有乙個 arraylist 存放觀察者們。

jdk提供了對觀察者模式的支援,使用observable類和observer介面

關聯行為場景,需要注意的是,關聯行為是可拆分的,而不是「組合」關係。事件多級觸發場景。

跨系統的訊息交換場景,如訊息佇列、事件匯流排的處理機制。

5. 模板方法模式

實現方式:

a)     父類模板類(規定要執行的方法和順序,只關心方法的定義及順序,不關心方法實現)

b)     子類實現類(實現a規定要執行的方法,只關心方法實現,不關心呼叫順序)

優點:1)封裝不變部分,擴充套件可變部分:把認為不變部分的演算法封裝到父類實現,可變部分則可以通過繼承來實現,很容易擴充套件。

2)提取公共部分**,便於維護。

3)行為由父類控制,由子類實現。

缺點:模板方法模式顛倒了我們平常的設計習慣:抽象類負責宣告最抽象、最一般的事物屬性和方法,實現類實現具體的事物屬性和方法。在複雜的專案中可能會帶來**閱讀的難度

6.**模式

一)靜態**

實現方式:

a) 為真實類和**類提供的公共介面或抽象類。(租房)

b) 真實類,具體實現邏輯,實現或繼承a。(房主向外租房)

c)  **類,實現或繼承a,有對b的引用,呼叫真實類的具體實現。(中介)

d) 客戶端,呼叫**類實現對真實類的呼叫。(租客租房)

二)動態**

實現方式:

a) 公共的介面(必須是介面,因為proxy類的newproxyinstance方法的第二引數必須是個介面型別的class)

b) 多個真實類,具體實現的業務邏輯。

c)  **類,實現invocationhandler介面,提供object成員變數,和set方法,便於客戶端切換。

d) 客戶端,獲得**類的例項,為object例項賦值,呼叫proxy.newproxyinstance方法在程式執行時生成繼承公共介面的例項,呼叫相應方法,此時方法的執行由**類實現的invoke方法接管。

cglib動態**和jdk**一樣,使用反射完成**,不同的是他可以直接**類(jdk動態**不行,他必須目標業務類必須實現介面),cglib動態**底層使用位元組碼技術,cglib動態**不能對 final類進行繼承。(cglib動態**需要匯入jar包)

//**主要類

public class cglibproxy implements methodinterceptor

設計模式 常用的設計模式介紹

簡單點說,就是乙個應用程式中,某個類的例項物件只有乙個,你沒有辦法去new,因為構造器是被private修飾的,一般通過getinstance 的方法來獲取它們的例項。getinstance 的返回值是乙個物件的引用,並不是乙個新的例項 懶漢式 執行緒不安全 public class singlet...

常用的設計模式

1 單例設計模式 單例設計模式主要是用於該類在專案中只能乙個例項,並對外提供獲取這乙個例項的方法 單例設計模式有餓漢式和飽漢式,其中餓漢式單例設計模式的特點是 執行緒安全,效率低 飽漢式單例設計模式的特點是 效率高,執行緒不安全 餓漢式單例設計模式 private singledemo privat...

常用的設計模式

閒來無聊學習學習設計模式,設計模式太多了,好像有20多種,其實在平時工作中沒有用到很多,有的在不經意之間就已經使用了,現在總結一些平時使用比較多的設計模式。概念 1.可以來劃分命名空間,從而清除全域性變數所帶來的危險。2.利用分支技術來來封裝瀏覽器之間的差異。3.可以把 組織的更為一體,便於閱讀和維...