HeadFirst採訪「工廠方法」和「抽象工廠」

2021-04-13 11:19:41 字數 2583 閱讀 4823

<>第四章的後面有段headfirst採訪工廠模式中的工廠方法模式及抽象工廠模式,感覺對理解這兩種模式很有幫助,大概的翻譯了採訪內容跟大家分享下~~

headfirst:哇,馬上就要採訪工廠模式中的兩位老大了,這是我們的第一次接觸啊,我現在心情很激動啊。

factory method:呃,你知道我自己是不太喜歡被你們把我和抽象工廠(abstract factory)混淆在一起。僅僅是因為我們都是工廠模式中的一員,所以把我們倆放在一起來採訪嗎,為什麼不獨自進行呢。

headfirst:你先別生氣嘛,我想一起採訪你們,這樣做的目的就是想要幫助那些讀者們消除你們倆誰是誰的混淆啊。你們倆確實有相同之處,而且我也聽說了人們有時候在使用工廠模式的時候,會把你們倆給混淆了。

abstract factory:確實是這樣啊,有時候我會被人們誤認為是工廠方法(factory method),而且我知道工廠方法你也有類似的困惑。其實我們都很擅長讓應用程式的高層模式在建立類的例項時無需依賴於這些類的具體實現。所以我能理解人們為什麼有時會把我倆給混淆了。

factory method:呃,也太過簡單地說我了吧。畢竟,我是讓類來負責建立物件的工作而你是使用一堆的物件;這就是咱倆最根本的區別啊。

headfirst:等等,factory method您能不能對上面說的那個根本區別再深入解釋下呢?

factory method:當然可以。抽象工廠和我都是用來產生物件的,這是我們的天職。但是我是通過繼承。。。

abstract factory:。。。我是通過物件的組合。

factory method:說得很對。所以這就意味著,你們如果想要通過我產生物件的話,就要通過繼承乙個抽象型別然後在子類裡覆蓋那個抽象類的factory method。

headfirst:這factory method是幹什麼用的呢?

factory method:當然是用來產生乙個(請大家注意是乙個,我想這也很關鍵)物件的。我的意思是說,工廠方法模式的乙個最核心的地方就是你們利用乙個子類,讓它來決定如何完成乙個具體物件的生成工作。通過這種方式,客戶端(呼叫者所在的類)只需要知道這個物件的抽象型別,而子類呢才關心這個抽象型別的真正實現類。所以呢,換句話說,我能分離客戶端和具體的實現類。

abstract factory:我也能實現,只不過是我通過另外一種不同的方式罷了。

headfirst:繼續,abstract factory。。。為我們談談有關物件組合的情況吧?

abstract factory:我提供了乙個抽象類(通常來說是介面)來建立乙個產品家族。這個抽象類的子類來定義這些產品是如何被生產的。為了使用這個工廠,你宣告乙個,然後再把乙個子類通過引數傳遞,來對它賦值{也就是說,在乙個客戶端類裡先宣告乙個抽象的工廠類,然後比如說可以在它的建構函式裡留個引數是個抽象型別(抽象工廠類)的,在例項化這個客戶端的時候把抽象工廠類的子類(也即是哪個產品族)傳進來,從而在建構函式裡完成對這個抽象類的例項化。}(在抽象類裡的一組方法返回的都是抽象產品)所以呢,跟工廠方法一樣,我也分離了客戶端和它們要使用的究竟是哪種具體的產品。

abstract factory:對。

abstract factory:確實是這樣,如果新的產品加進來了,我的介面必須改變,我知道人們都不喜歡這樣做。。。

factory method:

abstract factory:

factory method:哦~~快快行動吧,那可是重要的事啊!改變你的介面那就意味著你必須深入到所以實現了這個介面的子類,然後挨個改變!這看起來可有很多事情要做啊。

abstract factory:是的,但是我有乙個相對來說範圍比較大的介面因為我習慣了從一開始就產生整個產品族。你只是生成乙個產品,所以你不須要有乙個大的介面,只需在你的抽象類裡定義乙個這樣的方法就行了。

headfirst:抽象工廠,我聽說你經常用一些factory method來實現你的具體工廠類。

abstract factory:嗯,這點我承認。我的那些具體工廠通常實現乙個工廠方法來產生他們的具體產品。照我的情況來看,他們現在已經完全習慣產生產品。。。

factory method:。。。而按我的情況來看我通常在抽象生產者(角色,抽象類)裡實現一部分**來利用那些子類所產生的具體類(大概是說抽象的工廠類裡,這是乙個抽象類,不是介面的情況下,有一部分方法不是工廠方法,這些方法是留給那些所有子類用的,因為這是他們所共有的屬性或行為)

headfirst:聽起來你們倆都很擅長各自的工作。我肯定人們喜歡有乙個選擇的;畢竟,工廠是如此的有用,他們會在各種情況下恰當地使用工廠模式。你們都封裝了具體物件的產生過程從而達到應用程式的松耦合而且不依賴於具體的實現,這是相當重要地啊,無論是使用工廠方法還是使用抽象工廠。在最後請你們分別說幾句想說的話。

abstract factory:謝謝,請記住我,抽象工廠,在下面情況下請記住及時使用我:         

《Head First 設計模式》 工廠方法模式

工廠方法模式定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個。工廠方法讓類把例項化推遲到子類。ps 在設計模式中,實現乙個介面 泛指實現某個超型別 可以是類或介面 的某個方法。要點 產品抽象類 public abstract class product 1 產品a1 產品a1 public...

簡單工廠方法,工廠方法,抽象工廠方法

以大話設計模式計算器為例 簡單工廠方法是由具體執行功能類,工廠類,客戶端構成,工廠類有case語句,負責建立不同的類,客戶端呼叫工廠類裡面的工廠方法,工廠類的工廠方法根據客戶端傳進去的引數new相應的類的物件返回給客戶端,客戶端得到返回的物件用該物件初始化該物件的成員變數最後呼叫該物件的方法執行計算...

工廠方法模式 工廠方法模式

工廠方法模式是簡單工廠模式的公升級版,簡單工廠模式不符合設計模式的原則 即 單一職責,開閉原則 優點 職責明確,擴充套件方便 缺點 需要建立多個工廠 實現步驟 1.將工廠通用方法抽取介面 例如 ifactory 2.將產品抽取介面 例如 icar 3.實現各種產品 例如 baomacar,benti...