1. 程式人生 > >Java設計模式部落格全目錄

Java設計模式部落格全目錄

今天來對這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):把資料結構和作用於結構上的操作解耦合,使得操作集合可相對自由地演化。訪問者模式適用於資料結構相對穩定而演算法又容易變化的系統。訪問者模式的優點是增加操作很容易,因為增加操作意味著增加新的訪問者;而它的缺點就是增加新的資料結構很困難。

三、Java設計模式菜鳥系列目錄