Java常用設計模式

編程語言 Java 設計模式 Java團長 2017-04-19

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

該模式主要目的是使內存中保持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常用設計模式

這個是最簡單的例子了,就是通過工廠方法通過接口獲取對象的引用

三、建造模式

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

定義:

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

實用範圍:

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

  2. 當構造過程必須允許被構造的對象有不同表示時。

角色:

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

  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常用設計模式

學習Java的同學注意了!!!

學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:495273252【長按複製】我們一起學Java!

也歡迎大家關注團長微信公眾號,每日分享各種Java乾貨!

公眾號名稱:Java團長

微信號:aishangbianchengba

相關推薦

推薦中...