1. 程式人生 > >Java常用的幾種設計模式

Java常用的幾種設計模式

一、單例模式(有的書上說叫單態模式其實都一樣)

該模式主要目的是使記憶體中保持1個物件。看下面的例子:

方法一

Java常用設計模式

方法二

Java常用設計模式

synchronized :/'sɪŋkrənaɪzd/ :Java語言的關鍵字,當它用來修飾一個方法或者一個程式碼塊的時候,能夠保證在同一時刻最多隻有一個執行緒執行該段程式碼。

  • 當兩個併發執行緒訪問同一個物件object中的這個synchronized(this)同步程式碼塊時,一個時間內只能有一個執行緒得到執行。另一個執行緒必須等待當前執行緒執行完這個程式碼塊以後才能執行該程式碼塊。

  • 然而,當一個執行緒訪問object的一個synchronized(this)同步程式碼塊時,另一個執行緒仍然可以訪問該object中的非synchronized(this)同步程式碼塊。

  • 尤其關鍵的是,當一個執行緒訪問object的一個synchronized(this)同步程式碼塊時,其他執行緒對object中所有其它synchronized(this)同步程式碼塊的訪問將被阻塞。

  • 第三個例子同樣適用其它同步程式碼塊。也就是說,當一個執行緒訪問object的一個synchronized(this)同步程式碼塊時,它就獲得了這個object的物件鎖。結果,其它執行緒對該object物件所有同步程式碼部分的訪問都被暫時阻塞。

  • 以上規則對其它物件鎖同樣適用.

  • 如果你想學習Java可以來這個群,首先是一二六,中間是五三四,最後是五一九,裡面有大量的學習資料可以下載。

注:這二個方法實現了一樣的功能,但個人推薦採用第一種方法。

二、工廠模式

該模式主要功能是統一提供例項物件的引用。看下面的例子:

Java常用設計模式

這個是最簡單的例子了,就是通過工廠方法通過介面獲取物件的引用

三、建造模式

該模式其實就是說,一個物件的組成可能有很多其他的物件一起組成的,比如說,一個物件的實現非常複雜,有很多的屬性,而這些屬性又是其他物件的引用,可能這些物件的引用又包括很多的物件引用。封裝這些複雜性,就可以使用建造模式。

定義:

建造者模式:將一個複雜的物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

實用範圍:

  1. 當建立複雜物件的演算法應該獨立於該物件的組成部分以及它們的裝配方式時。

  2. 當構造過程必須允許被構造的物件有不同表示時。如果你想學習Java可以來這個群,首先是一二六,中間是五三四,最後是五一九,裡面有大量的學習資料可以下載。

角色:

在這樣的設計模式中,有以下幾個角色:

  1. Builder:為建立一個產品物件的各個部件指定抽象介面。

  2. ConcreteBuilder:實現Builder的介面以構造和裝配該產品的各個部件,定義並明確它所建立的表示,並提供一個檢索產品的介面。

  3. Director:構造一個使用Builder介面的物件,指導構建過程。

  4. Product:表示被構造的複雜物件。ConcreteBuilder建立該產品的內部表示並定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產品的介面。

角色Builder:

Java常用設計模式

角色ConcreteBuilder:

Java常用設計模式

Java常用設計模式

角色Director:

Java常用設計模式

角色Product:

Java常用設計模式

Java常用設計模式

Java常用設計模式

測試

Java常用設計模式

建造者模式在使用過程中可以演化出多種形式:

如果具體的被建造物件只有一個的話,可以省略抽象的Builder和Director,讓ConcreteBuilder自己扮演指導者和建造者雙重角色,甚至ConcreteBuilder也可以放到Product裡面實現。

在《Effective Java》書中第二條,就提到“遇到多個構造器引數時要考慮用構建器”,其實這裡的構建器就屬於建造者模式,只是裡面把四個角色都放到具體產品裡面了。

上面例子如果只製造男人,演化後如下:

Java常用設計模式

Java常用設計模式

測試:

Java常用設計模式

四、門面模式

這個模式個人感覺像是Service層的一個翻版。比如Dao我們定義了很多持久化方法,我們通過Service層將Dao的原子方法組成業務邏輯,再通過方法向上層提供服務。門面模式道理其實是一樣的。

具體看看這個例子

Java常用設計模式

Java常用設計模式

雖然這個例子不全,但基本意思已經很明顯了。

五、策略模式

這個模式是將行為的抽象,即當有幾個類有相似的方法,將其中通用的部分都提取出來,從而使擴充套件更容易。

看這個例子:

加法具體策略類

Java常用設計模式

除法具體策略類

Java常用設計模式

乘法具體策略類

Java常用設計模式

減法具體策略類

Java常用設計模式

抽象策略類也可以使用介面來代替

Java常用設計模式

策略環境類

Java常用設計模式

測試客戶端

Java常用設計模式