設計模式 簡單工廠 工廠方法 抽象工廠模式

2021-08-29 01:16:47 字數 3412 閱讀 2743

一、什麼是工廠模式?

工廠模式有一種非常形象的描述,建立物件的類就如乙個工廠,而需要被建立的物件就是乙個個產品;在工廠中加工產品,使用產品的人,不用在乎產品是如何生產出來的。從軟體開發的角度來說,這樣就有效的降低了模組之間的耦合。對於工廠模式,具體上可以分為三類:

1.簡單工廠模式;

2.工廠方法模式;

3.抽象工廠模式;

對於上面的三種工廠模式,從上到下逐步抽象,並且更具一般性,在gof的介紹中,簡單工廠和工廠方法合併在一起的。

二、簡單工廠模式

1.什麼是簡單工廠模式?

簡單工廠模式屬於類的建立型模式,又叫做靜態工廠方法模式。通過專門定義乙個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。

2.模式中包含的角色及其職責

工廠(cfruitfactory)角色:簡單工廠模式的核心,它負責實現建立所有例項的內部邏輯;

抽象產品(cfruit)角色:所有產品的父類,它負責描述所有例項所共有的公共介面;

具體產品(cbanana/cpear)角色:簡單工廠模式所建立的具體例項物件;

3.適用場合

在程式中,需要建立的物件很多,導致物件的new操作多且雜時,需要使用簡單工廠模式;由於物件的建立過程是我們不需要去關心的,而我們注重的是物件的實際操作,所以,我們需要分離物件的建立和操作兩部分,如此,方便後期的程式擴充套件和維護。

4.簡單工廠模式的優缺點

在這個模式中,工廠類是整個模式的關鍵所在。它包含必要的判斷邏輯,能夠根據外界給定的資訊,決定究竟應該建立哪個具體類的物件。使用者在使用時可以直接根據工廠類去建立所需的例項,而無需了解這些物件是如何建立以及如何組織的,有利於整個軟體體系結構的優化。不難發現,簡單工廠模式的缺點也正體現在其工廠類上,由於工廠類集中了所有例項的建立邏輯,所以「高內聚」方面做的並不好。另外,當系統中的具體產品類不斷增多時,可能會出現要求工廠類也要做相應的修改,擴充套件性並不很好。那麼能不能做到

不修改具體工廠角色的情況下引進新的產品,

比如新加一種型別的水果蘋果

三、工廠方法模式

1.什麼是工廠模式?

工廠方法模式同樣屬於類的建立型模式又被稱為多型工廠模式。工廠方法模式的意義是定義乙個建立產品物件的工廠介面,將實際建立工作推遲到子類當中。核心工廠類不再負責產品的建立,這樣核心類成為乙個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。

2.類圖角色和職責

抽象工廠(cfruitfactory):工廠方法模式的核心,任何工廠類都必須實現這個介面;

抽象產品(cfruit) :工廠方法模式所建立的所有物件的父類,它負責描述所有例項所共有的公共介面;

具體產品(cbanana/…):工廠方法模式所建立的具體例項物件

3.適用場合

工廠方法模式的意義是定義乙個建立產品物件的工廠介面,將

實際建立工作推遲到子類當中。核心工廠類不再負責產品的建立,這樣核心類成為乙個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。

a.在設計的初期,就考慮到產品在後期會進行擴充套件的情況下,可以使用工廠方法模式;

b.產品結構較複雜的情況下,可以使用工廠方法模式;

4.工廠方法模式和簡單工廠模式比較

a.結構上:工廠方法模式的核心是乙個抽象工廠類,而簡單工廠模式把核心放在乙個具體類上。工廠方法模式可以允許很多具體工廠類從抽象工廠類中將建立行為繼承下來,從而可以成為多個簡單工廠模式的綜合,進而推廣了簡單工廠模式。  

b.產品型別:簡單工廠模式產品單一,而工廠模式產品可以有多個

c.擴充套件性:當系統擴充套件需要新增新的產品物件時,僅僅需要新增乙個具體物件以及乙個具體工廠物件,原有工廠物件不需要進行任何修改,也不需要修改客戶端,很好的符合了「開放-封閉」原則(通過新增**的方式,不是通過修改**的方式完成功能的增強)。而簡單工廠模式在新增新產品物件後不得不修改工廠方法,擴充套件性不好。

簡單工廠模式產品單一,工廠方法模式產品雖然可以有多個,但每次只能產生乙個,那能不能同時產生多個呢?

四、抽象工廠模式

1.概念

抽象工廠模式是所有形態的工廠模式中最為抽象和最其一般性的。抽象工廠模式可以向客戶端提供乙個介面,使得客戶端在不必指定產品的具體型別的情況下,能夠建立多個產品族的產品物件;

2.模式中包含的角色及其職責

抽象工廠(cfruitfactory):抽象工廠模式的核心,包含對多個產品結構的宣告,任何工廠類都必須實現這個介面;

具體工廠(csouthfruitfactory/…)角色:具體工廠類是抽象工廠的乙個實現,負責例項化某個產品族中的產品物件;

抽象(cfruit)角色:抽象模式所建立的所有物件的父類,它負責描述所有例項所共有的公共介面。

具體產品(csouthbanana/cnorthbanana/…)角色:抽象模式所建立的具體例項物件

3.適用場合

工廠方法模式適用於產品種類結構單一的場合,為一類產品提供建立的介面;而抽象工廠方法適用於產品種類結構多的場合,主要用於建立一組(有多個種類)相關的產品,為它們提供建立的介面;就是當具有多個抽象角色時,抽象工廠便可以派上用場。

4.其他問題

2.修改cfruitfactory、csouthfruitfactory、cnorthfruitfactory類

5.用簡單工廠來改進抽象工廠

2.修改cfruitfactory類

6.利用反射技術進一步優化

利用反射技術來去除簡單工廠中switch或if,解除分支判斷帶來的耦合,這個可以直接看我們的專案**。

7、工廠方法模式和抽象工廠模式比較

1)、產品型別數量不同,工廠模式:要麼生產香蕉、要麼生產蘋果、要麼生產梨子;但是不能同時生產乙個產品組;抽象工廠:能同時生產乙個產品族(南方香蕉/蘋果/梨子)。

2)、工廠方法依靠繼承解決問題,抽象工廠依靠物件的組合解決問題。工廠方法要解決的問題是:「把例項化過程延遲到子類」,例項化過程是在繼承至抽象工廠類的派生類中完成的;而抽象工廠模式要解決的問題是:例項化並組織一系列相關的物件家族,這些物件通過組合的方式存在於抽象工廠類的派生類中,雖然例項化過程也是在派生類中完成,但是抽象工廠的側重點不是關注如何例項化物件,而是關注如何組織一系列物件。

3)、抽象工廠模式,就好比是兩個工廠方法模式的疊加

主要參考:大話設計模式

設計模式 簡單工廠 工廠方法 抽象工廠方法模式

簡介 工廠方法模式分為 簡單工廠模式 工廠方法模式 抽象工廠方法模式 簡單工廠模式是屬於建立型模式,又叫做靜態工廠方法 static factory method 模式,但不屬於23種gof設計模式之一。簡單工廠模式是由乙個工廠物件決定建立出哪一種產品類的實 uml圖示例 public class ...

設計模式 簡單工廠 工廠方法 抽象工廠

典型的介面和實現類如下,我們要根據相應的需求建立出不同的物件。public inte ce animal public class catimplements animal public class dogimplements animal public class animalfactory el...

設計模式 簡單工廠 工廠方法 抽象工廠

引言 最近發現一篇講解工廠模式比較簡易明了的文章,內容如下,原文連線為 簡單工廠模式 簡單工廠模式不是 23 種裡的一種,簡而言之,就是有乙個專門生產某個產品的類。比如下圖中的滑鼠工廠,專業生產滑鼠,給引數 0,生產戴爾滑鼠,給引數 1,生產惠普滑鼠。工廠模式也就是滑鼠工廠是個父類,有生產滑鼠這個介...