Java常用設計模式
一、單例模式(有的書上說叫單態模式其實都一樣)
該模式主要目的是使內存中保持1個對象。看下麵的例子:
方法一
方法二
synchronized :/'sɪŋkrənaɪzd/ :Java語言的關鍵字,當它用來修飾一個方法或者一個代碼塊的時候,能夠保證在同一時刻最多隻有一個線程執行該段代碼。
當兩個並發線程訪問同一個對象object中的這個synchronized(this)同步代碼塊時,一個時間內隻能有一個線程得到執行。另一個線程必須等待當前線程執行完這個代碼塊以後才能執行該代碼塊。
如果你想學習Java可以來這個群,首先是二二零,中間是一四二,最後是九零六,裏麵有大量的學習資料可以下載。
然而,當一個線程訪問object的一個synchronized(this)同步代碼塊時,另一個線程仍然可以訪問該object中的非synchronized(this)同步代碼塊。
尤其關鍵的是,當一個線程訪問object的一個synchronized(this)同步代碼塊時,其他線程對object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞。
第三個例子同樣適用其它同步代碼塊。也就是說,當一個線程訪問object的一個synchronized(this)同步代碼塊時,它就獲得了這個object的對象鎖。結果,其它線程對該object對象所有同步代碼部分的訪問都被暫時阻塞。
以上規則對其它對象鎖同樣適用.
注:這二個方法實現了一樣的功能,但個人推薦采用第一種方法。
二、工廠模式
該模式主要功能是統一提供實例對象的引用。看下麵的例子:
這個是最簡單的例子了,就是通過工廠方法通過接口獲取對象的引用
三、建造模式
該模式其實就是說,一個對象的組成可能有很多其他的對象一起組成的,比如說,一個對象的實現非常複雜,有很多的屬性,而這些屬性又是其他對象的引用,可能這些對象的引用又包括很多的對象引用。封裝這些複雜性,就可以使用建造模式。
定義:
建造者模式:將一個複雜的對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
實用範圍:
-
當創建複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。
-
當構造過程必須允許被構造的對象有不同表示時。
角色:
在這樣的設計模式中,有以下幾個角色:
-
Builder:為創建一個產品對象的各個部件指定抽象接口。
-
ConcreteBuilder:實現Builder的接口以構造和裝配該產品的各個部件,定義並明確它所創建的表示,並提供一個檢索產品的接口。
-
Director:構造一個使用Builder接口的對象,指導構建過程。
-
Product:表示被構造的複雜對象。ConcreteBuilder創建該產品的內部表示並定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產品的接口。
角色Builder:
角色ConcreteBuilder:
角色Director:
角色Product:
測試
建造者模式在使用過程中可以演化出多種形式:
如果具體的被建造對象隻有一個的話,可以省略抽象的Builder和Director,讓ConcreteBuilder自己扮演指導者和建造者雙重角色,甚至ConcreteBuilder也可以放到Product裏麵實現。
在《Effective Java》書中第二條,就提到“遇到多個構造器參數時要考慮用構建器”,其實這裏的構建器就屬於建造者模式,隻是裏麵把四個角色都放到具體產品裏麵了。
如果你想學習Java可以來這個群,首先是二二零,中間是一四二,最後是九零六,裏麵有大量的學習資料可以下載。
上麵例子如果隻製造男人,演化後如下:
測試:
四、門麵模式
這個模式個人感覺像是Service層的一個翻版。比如Dao我們定義了很多持久化方法,我們通過Service層將Dao的原子方法組成業務邏輯,再通過方法向上層提供服務。門麵模式道理其實是一樣的。
具體看看這個例子
雖然這個例子不全,但基本意思已經很明顯了。
五、策略模式
這個模式是將行為的抽象,即當有幾個類有相似的方法,將其中通用的部分都提取出來,從而使擴展更容易。
看這個例子:
加法具體策略類
除法具體策略類
乘法具體策略類
減法具體策略類
抽象策略類也可以使用接口來代替
策略環境類
測試客戶端
最後更新:2017-06-15 14:31:48