今天來對這23種設計模式做個總結。咱使用設計模式的目的是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性,當然設計模式并不是萬能的,項目中的實際問題還有具體分析。咱不能為了使用設計模式而使用,而是在分析問題的過程中,想到使用某種設計模式能達到咱需要的效果,而且比不使用設計模式更有優勢,那么咱該考慮使用設計模式了。
## 一、設計模式的一般分類
創建型(Creator)模式(共5種):單例、原型、建造者、工廠方法、抽象工廠。
結構型(Structure)模式(共7種):適配器、代理、外觀、橋接、組合、享元、裝飾者。
行為型(Behavior)模式(共11種):策略、觀察者、模板方法、迭代器、責任鏈、命令、備忘錄、狀態、訪問者、中介者、解釋器。
## 二、下面談談我對這23種設計模式的理解
**1、創建型(Creator)模式(共5種)**
①單例(Singleton)是一種常用的設計模式。在Java應用中,單例對象能保證在一個JVM中,該對象只有一個實例存在。實現方式主要有餓漢式和懶漢式兩種。
②原型(Prototype):該模式的思想就是將一個對象作為原型,對其進行復制、克隆,產生一個和原對象類似的新對象。實現方式主要有淺復制和深復制兩種。淺復制的關鍵是super.clone();而深復制,需要采用二進制流的形式寫入當前對象,再對其進行讀取。
③建造者(Builder):該模式是將各種產品集中起來進行管理。將很多功能集成到一個類里,這個類可以創造出比較復雜的東西。它關注的是創建復合對象,多個部分。
④工廠方法(Factory method):調用工廠里的方法來生產對象(產品)的。它有3種實現方式:1)普通工廠模式:就是建立一個工廠類,對實現了同一接口的一些類進行實例的創建)。2)多個工廠方法模式:是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字符串出錯,則不能正確創建對象,而多個工廠方法模式是提供多個工廠方法,分別創建對象。3)靜態工廠方法模式:將上面的多個工廠方法模式里的方法置為靜態的,不需要創建實例,直接調用即可。如果你想使用工廠方法模式可以優先選擇:靜態工廠方法模式。
⑤抽象工廠(Abstract factory):顧名思義,就是把工廠抽象出來,不同的工廠生產不同的產品。
**2、結構型(Structure)模式(共7種)**
①適配器(Adapter):將某個類的接口轉換成客戶端期望的另一個接口表示,目的是消除由于接口不匹配所造成的類的兼容性問題。主要分為三類:類的適配器模式、對象的適配器模式、接口的適配器模式。1)類的適配器模式:當希望將一個類轉換成滿足另一個新接口的類時,可以使用類的適配器模式,創建一個新類,繼承原有的類,實現新的接口即可。2)對象的適配器模式:當希望將一個對象轉換成滿足另一個新接口的對象時,可以創建一個Adapter類,持有原類的一個實例,在Adapter類的方法中,調用實例的方法就行。3)接口的適配器模式:當不希望實現一個接口中所有的方法時,可以創建一個抽象類Adapter實現所有方法,我們寫別的類的時候,繼承抽象類即可。
②代理(Proxy):代理模式其實就是多一個代理類出來,替原對象進行一些操作。比如咱有的時候打官司需要請律師,因為律師在法律方面有專長,可以替咱進行操作表達咱的想法,這就是代理的意思。有兩種實現方式:靜態代理(不使用JDK里面的方法)、動態代理(InvocationHandler和Proxy)。
③外觀(Facade):也稱門面模式。外觀模式是為了解決類與類之間的依賴關系的,像spring一樣,可以將類和類之間的關系配置到配置文件中,而外觀模式就是將他們的關系放在一個Facade類中,降低了類類之間的耦合度,該模式中沒有涉及到接口。
④橋接(Bridge): 把事物和其具體實現分開(抽象化與實現化解耦),使他們可以各自獨立的變化。橋接模式其實就是一種將N*M轉化成N+M組合的思想。
⑤組合(Composite):組合模式有時又叫部分-整體模式,將對象組合成樹形結構來表示“部分-整體”層次結構。
⑥享元(Flyweight):運用共享的技術有效地支持大量細粒度的對象。主要目的是實現對象的共享,即共享池,當系統中對象多的時候可以減少內存的開銷。在某種程度上,你可以把單例看成是享元的一種特例。
⑦裝飾者(Decorator):動態地將責任附加到對象上,若要擴展功能,裝飾者提供了比繼承更具有彈性的替代方案。保持接口,增強性能。
**行為型(Behavior)模式(共11種)**
①策略(Strategy)讓用戶可以選擇執行一個動作的方法,也就是說,用戶可以選擇不同的策略來進行操作。個人覺得策略模式可以用這個公式:不同的XXX 擁有不同的XXX供用戶選擇。比如說:不同的象棋棋子擁有不同的走法供用戶選擇。
②觀察者(Observer):在對象之間定義了一對多的依賴關系,這樣一來,當一個對象改變狀態時,依賴它的對象都會收到通知并自動跟新。Java已經提供了對觀察者Observer模式的默認實現,Java對觀察者模式的支持主要體現在Observable類和Observer接口。
③模板方法(Template method):在一個方法中定義了一個算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以再不改變算法結構的情況下,重新定義算法中的某些步驟。簡而言之:模板方法定義了一個算法的步驟,并允許子類為一個或多個步驟提供實現。
④迭代器(Iterator):提供了一種方法順序訪問一個聚合對象中的各個元素,而又不暴露其內部的表示。
⑤責任鏈(ChainOfResponsibility): 有多個對象,每個對象持有下一個對象的引用,形成一條鏈,請求在這條鏈上傳遞,直到某一對象決定處理該請求,但是發出者并不清楚最終哪個對象會處理該請求。
⑥命令(Command):將“請求”(命令/口令)封裝成一個對象,以便使用不同的請求、隊列或者日志來參數化其對象。命令模式也支持撤銷操作。
⑦備忘錄(Memento): 主要目的是保存一個對象的某個狀態,以便在適當的時候恢復對象。
⑧狀態(State):允許對象在內部狀態改變時改變它的行為,對象看起來好像修改了它的類。狀態模式說白了就是一個對像有不同的狀態,不同的狀態對應不同的行為,它其實是對switch case這樣的語句的拓展。
⑨解釋器(Interpreter):它定義了對象與對象之間進行某種操作之后會得到什么值。一般主要應用在OOP開發中的編譯器的開發中,所以適用面比較窄。
⑩中介者(Mediator):主要用來降低類與類之間的耦合的,因為如果類與類之間有依賴關系的話,不利于功能的拓展和維護,因為只要修改一個對象,其它關聯的對象都得進行修改。
?訪問者(Visitor):把[**數據結構**](http://blog.csdn.net/lhy_ycu/article/details/9374819)和作用于結構上的操作解耦合,使得操作集合可相對自由地演化。訪問者模式適用于數據結構相對穩定而算法又容易變化的系統。訪問者模式的優點是增加操作很容易,因為增加操作意味著增加新的訪問者;而它的缺點就是增加新的數據結構很困難。
## 三、Java設計模式菜鳥系列目錄
[Java設計模式菜鳥系列(一)策略模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/39721563)
[Java設計模式菜鳥系列(二)觀察者模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/39755577)
[Java設計模式菜鳥系列(三)裝飾者模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/39759199)
[Java設計模式菜鳥系列(四)工廠方法模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/39760895)
[Java設計模式菜鳥系列(五)抽象工廠模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/39784403)
[Java設計模式菜鳥系列(六)單例模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/39785513)
[Java設計模式菜鳥系列(七)命令模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/39804057)
[Java設計模式菜鳥系列(八)適配器模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/39805069)
[Java設計模式菜鳥系列(九)外觀模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/39805735)
[Java設計模式菜鳥系列(十)模板方法模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/39806973)
[Java設計模式菜鳥系列(十一)迭代器模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/39807741)
[Java設計模式菜鳥系列(十二)組合模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/39828653)
[Java設計模式菜鳥系列(十三)狀態模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/39829859)
[Java設計模式菜鳥系列(十四)代理模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/39856435)
[Java設計模式菜鳥系列(十五)建造者模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/39863125)
[Java設計模式菜鳥系列(十六)原型模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/39997337)
[Java設計模式菜鳥系列(十七)橋接模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/40008711)
[Java設計模式菜鳥系列(十八)責任鏈模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/40018231)
[Java設計模式菜鳥系列(十九)備忘錄模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/40018967)
[Java設計模式菜鳥系列(二十)解釋器模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/40019829)
[Java設計模式菜鳥系列(二十一)享元模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/40021651)
[Java設計模式菜鳥系列(二十二)中介者模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/40027109)
[Java設計模式菜鳥系列(二十三)訪問者模式建模與實現](http://blog.csdn.net/lhy_ycu/article/details/40028509)
[**Java設計模式菜鳥系列教程PDF下載地址:http://download.csdn.net/detail/jave_lover/8714347**](http://download.csdn.net/detail/jave_lover/8714347)
- 前言
- (一)策略模式建模與實現
- (二)觀察者模式建模與實現
- (三)裝飾者模式建模與實現
- (四)工廠方法模式建模與實現
- (五)抽象工廠模式建模與實現
- (六)單例模式建模與實現
- (七)命令模式建模與實現
- (八)適配器模式建模與實現
- (九)外觀模式建模與實現
- (十)模板方法模式建模與實現
- (十一)迭代器模式建模與實現
- (十二)組合模式建模與實現
- (十三)狀態模式建模與實現
- (十四)代理模式建模與實現
- (十五)建造者模式建模與實現
- (十六)原型模式建模與實現
- (十七)橋接模式建模與實現
- (十八)責任鏈模式建模與實現
- (十九)備忘錄模式建模與實現
- (二十)解釋器模式建模與實現
- (二十一)享元模式建模與實現
- (二十二)中介者模式建模與實現
- (二十三)訪問者模式建模與實現
- Java設計模式博客全目錄