設計模式概述

設計模式六大原則:

1)單一職責原則

2)里氏替換原則

3)依賴倒置原則

4)接口隔離原則

5)迪米特法則

6)開閉原則

 

基本模式:接口、抽象父類、私有方法、訪問者方法、常數管理器

創建模式:工廠模式、抽象工廠模式、單例模式、原型模式

結構模式:裝飾器模式、適配器模式、責任鏈模式、外觀模式、代理模式、橋接模式

行爲模式:命令模式、備忘錄模式、觀察者模式、策略模式

 

提高性能:享元模式、單例模式、原型模式

增加系統複雜度:享元模式、迭代器模式、工廠模式、橋接模式、適配器模式

擴展性高:建造者模式、工廠模式、橋接模式

 

1、享元模式。

享元模式嘗試重用現有的同類對象,如果未找到匹配的對象,則創建新對象。主要用於減少創建對象的數量,以減少內存佔用和提高性能。

主要解決:在有大量對象時,有可能會造成內存溢出,我們把其中共同的部分抽象出來,如果有相同的業務請求,直接返回在內存中已有的對象,避免重新創建。

何時使用: 1、系統有大量相似對象。2、這些對象消耗大量內存。

應用實例: JAVA 中的 String,如果有則返回,如果沒有則創建一個字符串保存在字符串緩存池裏面。

優點:大大減少對象的創建,降低系統的內存,使效率提高。

缺點:提高了系統的複雜度,需要分離出外部狀態和內部狀態,不能被共享的數據屬性,可以被設計爲非共享享元類,即享元模式的外部狀態。

 

2、外觀模式

定義一個高層接口,使得子系統更容易使用,且隱藏系統的複雜性。

主要解決:降低訪問複雜系統的內部子系統時的複雜度。

何時使用:定義系統的入口。

優點: 1、減少系統相互依賴。 2、提高靈活性。

缺點:不符合開閉原則,如果要改東西很麻煩,繼承重寫都不合適。

 

3建造者模式

使用多個簡單的對象逐步構建成一個複雜的對象。

主要解決:有時候面臨着"一個複雜對象"的創建工作

何時使用:一些基本部件不會變,而其組合經常變化的時候。

優點: 1、建造者獨立,易擴展。 2、便於控制細節風險。

缺點: 1、產品必須有共同點,範圍有限制。 2、若內部變化複雜,會有很多的建造類。

 

4迭代器模式

用於順序訪問集合對象的元素,不需要知道集合對象的底層表示。

角色構成:定義boolean hasNext, Object next

主要解決:不同的方式來遍歷整個聚合對象。

何時使用:遍歷一個聚合對象。

優點: 支持以不同的方式遍歷一個聚合對象。 

缺點:在一定程度上增加了系統的複雜性。

 

5責任鏈模式(CoR模式)

爲請求創建了一個接收者對象的鏈,對請求的發送者和接收者進行解耦。

應用實例: JS 中的事件委託。

優點: 1、降低耦合度。2、允許動態地新增或者刪除責任。3、增加新的請求處理類很方便。 

缺點: 1、不能保證請求一定被接收。 2 、可能不容易觀察運行時的特徵,有礙於除錯。

案例:

 

類圖

時序圖

 

 

6工廠模式

通過使用一個共同的接口來指向新創建的對象,在創建對象時不會對客戶端暴露創建邏輯。

主要解決:主要解決接口選擇的問題。

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

優點: 1、只要知道其名稱就可以創建一個對象。 2、擴展性高,如果想增加一個產品,只要擴展一個工廠類就可以。 3、屏蔽產品的具體實現,調用者只關心產品的接口。

缺點:每次增加一個產品時,都需要增加一個具體類和對象實現工廠,在一定程度上增加了系統的複雜度

 

7抽象工廠模式

圍繞一個超級工廠創建其他工廠,每個生成的工廠都能按照工廠模式提供對象。

主要解決:主要解決接口選擇的問題。

 

8單例模式

該類負責創建自己的對象,同時確保只有單個對象被創建。

這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。

主要解決:一個全局使用的類頻繁地創建與銷燬。

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

優點:

1、在內存裏只有一個實例,減少了內存的開銷,尤其是頻繁的創建和銷燬實例(如jQuery

2、避免對資源的多重佔用(比如寫文件操作)。

缺點:沒有接口,不能繼承,與單一職責原則衝突

 

9橋接模式

將抽象部分與實現部分分離,使它們可以獨立的變化。

主要解決:在有多種可能會變化的情況下,用繼承會造成類爆炸問題,擴展起來不靈活。

優點: 1、抽象和實現的分離。 2擴展性高 3、實現細節對客戶透明。

缺點:橋接模式的引入會增加系統的理解與設計難度。

 

10適配器模式

將一個類的接口轉換成客戶希望的另外一個接口。

主要解決:主要解決在軟件系統中,常常要將一些"現存的對象"放到新的環境中,而新環境要求的接口是現對象不能滿足的。

優點: 可以讓任何兩個沒有關聯的類一起運行。

缺點: 過多地使用適配器,會讓系統非常零亂。

 

11、原型模式

用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。

如何解決:利用已有的一個原型對象,快速地生成和原型對象一樣的實例。

優點: 性能提高。

 

12、代理模式

爲其他對象提供一種代理以控制對這個對象的訪問。

如何解決:增加中間層。

和適配器模式的區別:適配器模式主要改變所考慮對象的接口,而代理模式不能改變所代理類的接口。

 

13、命令模式

將一個請求封裝成一個對象,從而使您可以用不同的請求對客戶進行參數化。

 

14、中介者模式

用一箇中介對象來封裝一系列的對象交互。

 

15、備忘錄模式

保存一個對象的某個狀態,以便在適當的時候恢復對象。

何時使用:允許用戶取消不確定或者錯誤的操作,能夠恢復到他原先的狀態,使得他有"後悔藥"可吃。

 

16、觀察者模式

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

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

何時使用:一個對象的狀態發生改變,所有的依賴對象都將得到通知,進行廣播通知。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章