Java設計模式之工廠模式

梁援—晉 14年前發布 | 7K 次閱讀 Office 15 解碼器 JavaScript

Java設計模式之工廠模式

工廠模式的幾種形態:

首先,工廠模式是做什么的呢?

工廠模式專門負責將大量有共同接口的類實例化.工廠模式可以動態決定哪一個類實例化,而不必事先知道每次要實例化哪個類.

了解了工廠模式之后,我們可以總結一下工廠模式有哪幾種形態.

1,簡單工廠模式(靜態工廠模式).

2,工廠方法模式(多態性工廠,虛擬構造器模式)

3,抽象工廠模式(工具箱模式)

一下逐一介紹這三種工廠模式,并討論他們的優缺點.

簡單工廠模式:

一下是簡單工廠模式的簡單類圖.

一下我們類介紹一下簡單工廠模式的結構.

首先我們應該明白一點:簡單工廠模式是類的創建模式,這個模式的一般性結構如圖所示.

簡單工廠模式是由一個工廠類根據傳入的參數決定創建哪種類型的產品的實例.一下以示意性的實現為例說明簡單工廠模式的結構.

從圖中可以看出:簡單工廠模式涉及到的角色有:

工廠類角色(Creator):工廠類角色是簡單工廠模式的核心,包含和應用緊密相連的商業邏輯.工廠類在客戶端的調用下創建產品對象.他往往有一個具體的java類實現.

抽象產品角色(Product):擔任這個角色的類是由工廠方法模式所創建的對象的父類.或者是他們共有的接口.抽象產品角色可以用一個java接口或者java抽象類實現.

抽象產品角色的主要目的是給所有的具體產品類提供一個共同的類型.在最簡單的情況下,可以簡化為一個表示接口.

既然接口和抽象類都可以實現抽象產品角色,那么用哪個更合適呢.或者說用在什么情況下用接口,在什么情況下用抽象類呢.

總結:如果模式所產生的具體產品類彼此之間沒有共同的商業邏輯,那么抽象產品角色可以有一個java接口扮演,相反,如果這些具體類產品彼此之間確實有共同的商業邏輯,那么這些共有的邏輯就應該移動到抽象角色里.這就意味這抽象角色應當有一個抽象類扮演.

具體產品角色(Concrete Product):工廠方法模式所創建的任何對象都是這個角色的實例.具體產品角色有一個java類實現.

注意:

1,在一個工廠類中可以存在多個工廠方法.每個工廠類可以有一個或者多個工廠方法,分別負責創建不同類型的產品對象.再有就是如果,整個系統中僅有一個具體產品角色的話,那么就可以省略掉抽象產品角色.

2,在某些特殊的情況下,工廠角色與抽象產品角色也可以合并.典型的應用就是java.text.DateFormat.一個抽象產品類同時是子類的工廠.

3,更有甚者啊.在某些更特殊的情況下,如果抽象產品角色已經被省略,而工廠角色還可以與具體產品角色合并.換言之產品類自產自銷,自己產生自己的實例.

就想上圖一樣.

我里個去啊!!這聽起來怎么就這么熟悉呢.怎么就這么像單例模式和多例模式啊.

好了,簡單工廠模式是設計模式中最簡單的模式之一,但是也是最根本的設計模式之一

下面我們就來看看簡單工廠模式和其他模式之間的關系.

單例模式:單例模式使用了簡單工廠模式.單例類具有一個靜態工廠方法提供自身的實例.一個抽象產品類同時也是子類的工廠.

但是單例模式有不僅僅是簡單工廠模式的退化情形,單例模式要求單例類的構造器私有.單例類使用一個靜態的屬性存儲自己的唯一的實例,工廠方法永遠僅提供這一個實例.

多例模式:多例模式是對單例模式的推廣.他們的共同之處都是禁止外界直接實例化.同時靜態工廠方法向外界提供循環使用的自身的實例.不同之處是單例模式僅有一個實例,而多例模式可以有多個實例.

多例模式往往有一個聚集屬性,通過這個聚集屬性登記已經創建過的實例達到循環使用實例的目的.一般而言,一個典型的多例類具有某種內部狀態,這個內部狀態可以用來區分各個實例.而對應于每個每一個內部狀態,都只有一個實例存在.

備忘錄模式:單例模式和多例模式使用一個屬性或者聚集屬性類登記所創建的產品對象,以便可以通過查詢這個屬性或者聚集屬性來找到并共享已經創建了的產品對象,這就是備忘錄模式的應用.備忘錄模式的簡略類圖如下.

好了,簡單工廠模式的基礎知識大概也就這和門些了,來總結一下簡單工廠模式的優缺點吧

優點:簡單工廠模式的核心是工廠類.這個類包含必要的判斷邏輯.可以決定在什么時間創建類的實例.那么客戶端就可以避免直接創建類的實例的責任.而僅僅負責消費產品.簡單工廠模式同個這種方法實現了對責任的分割.

缺點:當產品類有復雜的錯層次等級結構的時候.工廠類只有它自己,以不變應萬變.顯的力不從心.工廠類中聚集了所有產品的創建邏輯形成了一個無所不能的上帝類.當上帝類忽然不能工作了,那么整個系統也就不能工作了.另外,當產品類有不同的借口種類時,工廠類需要判斷在什么時間創建某種產品.這種對時機的判斷和對哪一種產品的普安段邏輯混合在一起.使得系統在將來驚醒功能的寬肩較為困難.

最后總結一下,簡單工廠模式在java中的應用吧.

java.date.DataFormat

SAX2庫中的XMLRraderFactory

 本文由用戶 梁援—晉 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!