2012-05-02 140 views
3

所以我不確定這是不是合法的工廠。大多數工廠的我看到有這樣的事情在客戶端:創建一個c#工廠

if(//something) 
    factory = new Type1Factory(); 
else 
    factory = new RegularFactory(); 

然後他們通過去像factory.Create();

所以基本上的條件來檢查你想要哪個工廠創建對象是正確調用代碼。我寧願隱藏它,並在工廠中擁有自己的條件,我想這不會再被稱爲工廠了?

像這樣:

DateScheduleRequest request = new DateScheduleRequest(); 
DateScheduleBuilder dateScheduleBuilder = new DateScheduleBuilderFactory(request).Create(); 

dateScheduleBuilder對象將基本上是某種類型的依賴於發送到工廠構造方法的請求。

有沒有另外一種模式,或者這只是某種方式來做工廠?

基本上,DateScheduleBuilder將是一大堆其他類型的構建器繼承的父類,但我的調用代碼知道這個抽象類有一個方法,並且它不需要知道請求類型,只是它需要將它傳遞給工廠並調用一種方法。

+0

這聽起來完全正常,並且是根據四人幫 –

回答

2

我想你在描述第二部分的工廠模式。第一部分不是因爲它依賴於調用者知道如何構建所需的對象。 在您的示例中,DateScheduleBuilderFactory將能夠知道如何解釋對象request中的信息並返回從DateScheduleBuilder派生的對象。

簡而言之,就像Johm Dom所說的那樣。你已經在那裏...

+1

是一個完全合法的工廠。在我的閱讀中,@slandau認爲如果'DateScheduleBuilder dateScheduleBuilder'不完全是基類型'DateScheduleBuilder',那麼它不計數。但它確實如此。 –

1

首先,第一個片段是非常好的。我寧願花我的時間添加功能,修復錯誤比重構這個。

如果我從頭開始設計這個代碼,我會隱藏if例如在構造函數中。一個好的經驗法則是:「只要圖書館能夠爲消費者輕鬆地做些事情,它就應該做到這一點」。

第三種選擇是將if語句移動到vtable - 多態性。

+0

我喜歡在構造函數中隱藏IF,並使用Polymorphism行爲來簡化生活。 – Turbot

1

你有什麼可以。

另一種方法是建立工廠。所以,你必須具有系統會根據請求一個工廠實現的方法的類(像IDateScheduleBuilderFactory GetDateSceduleBuilderFactory(request)然後消費者呼籲IDateScheduleBuilderFactoryCreate()獲得生成器對象。

它稍微令人費解,而且意味着你有一個職責單一的班級(即一個班級的職責是將請求轉化爲正確的工廠類型,其他班級是實際不同類型的工廠),您將能夠更容易地進行測試。要測試現在使用正確類型的工廠給出一個特定的請求嗎?你必須通過創建的結果來確定,而不是僅僅檢查GetDateSceduleBuilderFactory()方法返回的類型。

你也可以讓你當前的工廠公開一個像public bool CanHandleRequest(request)這樣的方法,它允許每個工廠決定它是否是特定請求的正確工廠,那麼工廠工廠可以在其構造函數中接受工廠集合, GetDateSceduleBuilderFactory(request)方法被調用,它可以循環所有工廠,詢問每個工廠是否可以處理該請求,以及何時它找到可以返回它的工廠。

這樣做的好處是您在添加新工廠時無需更改任何邏輯,只需要一些代碼即可獲取所有通過反射實現接口的工廠,然後在添加新工廠時會自動獲得。

0

嚴格來說,它不是一個工廠,因爲它不使用該類型來決定創建哪個對象,但它是這樣一個常見(而且有用)的習慣用法,頭部設計模式書被稱爲簡單工廠。

這是在我看來完全合法的,而且是非常有用的(例如,如果創建策略)在正確的地方,

相關問題