設計模式是爲了解決某種問題而進行的代碼設計,通過許多工程師反覆的使用,最後造成了一種模式,它不針對於特定的語言,隸屬於公共技術分類。由於做者是Java程序員,因此在編碼實現中都使用Java語言。程序員
設計模式一般包含如下幾個部分。算法
首先是問題,它是爲了解決什麼問題而存在的。編程
其次爲實際應用場景,如何解決特定場景下的問題,例如在單例模式時,存在多線程,多JVM等等的場景。設計模式
最後是實現方案,如何經過編程語言來編碼實現。本文也經過這種結構來介紹設計模式,爲了方便理解,在最後會研究一個優秀的示例,示例的取材來源於經常使用的框架,Java代碼等等。數組
設計模式按照其功能,特色能夠分爲三類網絡
建立型模式 數據結構
建立型模式主要的功能就是建立對象。它能夠分爲兩種類型,一種爲建立對象的實例(如下簡稱建立分類),另一種爲複用現有對象的實例(如下簡稱複用分類)。它總共包含七種設計模式。多線程
- 單例模式:在特定的環境中,保證對象只存在單個實例。隸屬於建立分類。
- 工廠模式:爲了建立對象樹,工廠模式返回的都是對象樹的根類。根據對象樹的複雜程度,應用不一樣的工廠模式。當對象樹下包含的種類數量較少時(一般能夠枚舉,例如撲克牌的花色,大小),使用簡單工廠模式;當對象的種類比較多,而且擁有幾種簡單的分類時,而且每種類型下面又能夠枚舉時(例如手機,分爲蘋果,小米,華爲,蘋果下面又能夠細分),可使用工廠方法模式;當對象的數量比較巨大時,使用抽象工廠模式。隸屬於建立分類。
- 構建者模式:爲了建立複雜對象,在建立對象中,須要分步進行時,可使用構建者模式。隸屬於建立分類。
- 原型模式:經過已有對象的實例來建立新的實例對象,它的解決方案依賴於Cloneable接口,其餘語言的實現方案能夠自行研究。隸屬於複用分類
- 對象池模式:爲了複用已有對象的實例,而不用從新建立,它的應用很是普遍。隸屬於複用分類。
結構型模式 架構
結構型模式主要的特色是,在它的解決方案中,在不修改原有代碼的基礎上,添加新的類來實現。按照功能將其分爲三種,第一種爲解耦,適配器模式。組合模式。第二種爲了知足新的需求,添加新的功能,裝飾器模式,添加新的功能實現方式,橋接模式。第三種爲了提升性能,減小內存的使用,享元模式,減小耗時資源的使用,代理模式。它們的格式通常都比較固定。它總共有六種設計模式。框架
- 適配器模式:爲了實現原有類型和現有類型的解耦。這裏的類型能夠爲接口或者是類,總共分爲4種場景,當原有類型爲接口,現有類型爲接口;當原有類型爲接口,現有類型爲類;當原有類型爲類,現有類型爲接口;當原有類型爲類,現有類型爲類,每一種場景對應特定的結構。它的實現方案爲添加XXAdapter來實現。
- 組合模式:對於對象使用者而言,爲了統一處理對象與它的集合類型。對象的集合類型自身維護添加,刪除,替換對象等等功能,它的實現方案爲集合類型與對象實現相同的接口,對於接口中關於集合類型的方法,對象拋出異常或提示不支持的操做。
- 橋接模式:對於特定的功能,爲了提供一種實現方案,而且能夠在這些實現方案中相互切換。爲了知足這樣的需求,須要將對象與功能的實現方式進行解耦。它的實現方案爲將對象的功能委託給某個接口類,當須要新的實現方式時,經過添加新的接口實現類來實現。
- 裝飾器模式:爲了知足需求,須要在原有的接口提供新的功能,它與橋接模式很類似,橋接模式是在原有的功能上提供新的實現方式,裝飾器模式是提供新的功能,例如排序,須要添加二分法排序,可使用橋接模式,添加一個二分法的接口實現類來知足需求。它的特色爲原來的功能須要複用原來的實現,新的功能須要添加新的子類來實現。
- 享元模式:爲了減小在建立對象時的內存消耗,將對象的公共屬性封裝在公共類型中,而私有屬性封裝在私有類型中,在建立對象時,經過建立私有對象,私有對象中引用公有對象,以此來達到共享公共屬性的目的。經過減小公共屬性佔有的內存來減小內存的開銷。
- 代理模式:代理模式的做用有兩種,第一種爲了提供性能,減小使用較大的資源,例如在網頁在初始化的過程當中,一般加載一個URL連接,而當用戶點擊時,此時去加載比較大的網絡資源,一般爲圖片,視頻等等,此時的代理類至關於實際類型的快捷方式,它的實現方案爲靜態代理。第二種爲了添加公共操做,例如校驗權限,記錄日誌等等,當調用實際對象的方法時,實際調用的是代理對象的方法,代理對象方法能夠由本身定義,可是都擁有原來的方法。此時代理類至關於黑客,在原有方法中添加了本身的方法,此時實際對象並不知道代理對象的存在。不管是哪一種情形,它的實現方案都是經過添加代理類。
行爲型模式
它的主要特色是,它更貼近於生活,它的問題每每能夠轉換爲實際的生活場景,它的解決方案中,各個對象每每對應生活中的各類角色。因此理解行爲型模式時,模擬爲生活場景會很是容易理解。它包含十一種設計模式。
- 職責鏈模式:處理請求,流程化的響應。能夠理解爲生活中的各類流程,例如醫院掛號,公司報銷流程。
- 命令模式:處理請求,響應。將請求方與實際的響應方進行解耦,將請求方的響應委託給第三者。例如生活中的點餐。快遞員配送流程。
- 解釋器模式:待補充
- 迭代器模式:爲了遍歷不一樣的集合類型。集合的類型能夠爲數組,List,Set等等。它不依賴於具體的集合類型,而依賴鏈式的數據結構。
- 中介者模式:待補充。
- 備忘錄模式:記錄對象被修改的每一個狀態。這個類比於實際開發中版本控制工具,記錄文件被修改的每一個狀態。
- 觀察者模式:將對象狀態的變化發送給對象的訂閱者。例如生活中的報紙訂閱,網購時商品價格下降時通知消費者,微博訂閱等等。
- 策略模式:與橋接模式很類似,爲了實現不一樣的算法,而且能夠在算法之間來回切換。例如生活中聯繫某我的,能夠經過郵件,網絡通信工具,電話方式來通知,當一種方式不可行時,須要有別的選擇。
- 模板模式:將設計與實現進行解耦,模擬爲生活中架構師設計了代碼,讓程序員去實現具體的功能。
- 訪問者模式:爲了調用相同方法,而卻擁有不一樣的對象類型,彼此之間沒有繼承的父子關係。能夠理解爲爲了method不一樣的object。其中method表示方法,通常抽象爲visit方法,object爲各類不一樣的類型。例如對象的Comparable,迭代者模式能夠說是一種特定的實現。
- 空對象模式:當實現一個功能時,能夠有不一樣的選擇。能夠創建一種選擇的順序,例如Log4j在加載配置文件時。