2010-04-24 22 views
6

我想了解工廠的設計模式。有創建對象工廠的好處嗎?

我不明白爲什麼在客戶和產品(客戶需要的對象)之間有一箇中間人是很好的。

例如無工廠:

$mac = new Mac(); 

例如有一家工廠:

$appleStore = new AppleStore(); 
$mac = $appleStore->getProduct('mac'); 

如何工廠模式從產品分離的客戶端?

可能有人給將來的代碼更改,將在例1中的負面影響的例子,但例如2正讓我明白了脫鉤的重要性?

謝謝。

+1

第二個人似乎更像是一種關係而不是工廠對我......? – SeanJA 2010-04-24 04:53:22

回答

5

我認爲這與構建某些類型的對象所需的資源來做。

通俗地說,如果你告訴別人打造一臺Mac,這將是一個艱苦的過程,將需要數年的設計,開發,製造和測試的,它可能不會做的權利。這個過程將不得不爲每一臺Mac重複。然而,如果你引進一家工廠,所有的辛苦工作只能完成一次,然後Mac可以更便宜地生產。

現在考慮Joomla的factory.php。根據我所知道的,JFactory的主要目的是彙集對象並確保應該相同的對象不被複制。例如,JFactory::getUser()將返回對唯一一個對象的引用。如果該用戶對象中的某些內容發生更改,它將出現在任何地方。另請注意,JFactory::getUser()返回一個引用,而不是一個新的對象。這是你無法用構造函數完成的事情。

通常,在構建對象時需要本地上下文,並且該上下文可能會持續存在,並且可能會採用多種形式。例如,可能有一個MySQL數據庫持有用戶。如果User對象是使用構造函數創建的,則需要將Database對象傳遞給構造函數(或者使其依賴於全局變量)。如果您決定將您的應用程序切換到PostgreSQL,那麼Database對象的語義可能會發生變化,導致構造函數的所有用途需要審查。全局變量讓我們隱藏這些細節,工廠也是如此。因此,用戶工廠將從需要用戶對象的位置解耦用戶對象的細節。

什麼時候工廠有幫助?構建對象時涉及背景細節。什麼時候建設者更好?當全局變量足夠時。

+1

+1類比獎金 – SeanJA 2010-04-24 05:03:29

+0

但這不是所謂的「移動過程到中央的地方」。我不明白的是解耦這個詞。 – 2010-04-24 05:13:19

+0

但如果我需要更改數據庫和即時通訊使用工廠,我仍然需要在工廠更改我的代碼。這是我不太明白的部分。無論哪種方式,我必須改變,現在我只是把它移到另一個班級,工廠。我可以理解,如果處理框架/ os應用程序,這是很好的。您的用戶與您的代碼交互不必重寫他們的代碼。但如果我是唯一一個使用我寫的代碼的工廠,那麼工廠怎麼樣更好呢?如果我更改數據庫,我仍然需要更改。 – 2010-04-24 05:40:15

1

本示例返回Mac類型的對象,它可以永遠不會有什麼不同:

$mac = new Mac(); 

它不可能是Mac一個子類,而不是它可以是一個其的Mac的接口匹配類。

而下面的例子可以返回Mac型或任何其他類型的工廠決定是合適的對象。

$appleStore = new AppleStore(); 
$mac = $appleStore->getProduct('mac'); 

您可能需要一套Mac,每個代表的Mac不同型號的子類。然後你在工廠編寫代碼來決定使用哪些子類。你不能用new運營商來做到這一點。

因此,工廠爲您創建對象提供了更大的靈活性。靈活性往往與解耦有關。


回覆您的留言:我不會說從未使用new。實際上,我確實使用new來創建大多數簡單對象。但是與誰在編寫客戶端代碼無關。工廠模式適用於需要能夠選擇動態實例化類的體系結構的情況。

在您的Apple Store示例中,您可能需要一些簡單的代碼來實例化產品並將其添加到購物車。如果您使用new,並且針對每種不同的產品類型都有不同的對象類型,則必須編寫一個巨大的case語句,以便可以創建適當類型的new對象。每次添加產品類型時,都必須更新case聲明。你可能在應用程序的其他部分有幾個這樣的case聲明。

通過使用工廠,您只需要更新一個位置,即知道如何獲取參數並實例化正確類型的對象。應用中的所有位置都會隱式獲得對新類型的支持,而不需要更改代碼。無論你是唯一的開發者還是你在一個團隊中,這都是一場勝利。

但是,如果您不需要支持各種子類型,則不需要工廠。在簡單的情況下繼續使用new

+0

所以關注點在於「每當我更改我的代碼時,我該如何編寫代碼,CLIENT不必」?所以基本上我從不希望客戶在「最終產品」上使用新的。我想爲創建產品提供一個抽象層(工廠)。所以他不必知道幕後發生了什麼?我對麼?但是當我自己編碼一切時呢?無論如何,我必須改變。我不太清楚重點在哪裏,或者我作爲開發人員想做什麼。 – 2010-04-24 05:18:43

相關問題