我有一個工廠,創建了廣泛通過我的應用程序使用的對象。工廠創建的一些對象需要另一個依賴關係。此可選依賴項是一個接口/類,其中包含來自本地設置文件的設置。目前,工廠界面和設置界面都被注入了20個類。雖然,類的數量會少些,如果應用程序繼承樹是不是6-7級深(指的IFactory和ISettings至6個構造獲得通過,並最終在一個基類,它其分配給一個領域到達)。是否在工廠持有信息,而不是將其通過調用代碼任何意義?
深層繼承不會很快發生變化,但我認爲可以通過從它們中刪除ISettings並將其放入IFactory實現本身來減輕這些構造函數的負載。該ISettings將通過構造函數中注入混凝土工廠,然後強似的ISettings作爲Create()方法的一部分,它只是使用工廠ISettings只讀屬性。一旦程序啓動,這些設置保證不可變。
這是否以任何方式皺起了眉頭,有沒有更好的方法來解決這個問題?一些同事認爲工廠應該幾乎從不保持狀態......但他們不知道是什麼原因。
這些都是類似的問題,我發現,這給了答案,但我仍然在尋找一個更充實的答案,如果可能的話。
Adding Properties to Abstract Factory
Abstract Factory Pattern and Properties
簡單的例子:
interface IObjValidator
{
bool Validate();
}
interface IObjValidatorFactory
{
IObjValidator Create();
}
class ObjValidatorFactory : IObjValidatorFactory
{
// Is it OK for the factory to hold this field?
private readonly ISettings settings;
public IObjValidator(ISettings settings)
{
this.settings = settings;
}
IObjValidator Create(ObjValidatorMode mode)
{
switch(mode)
{
case ObjValidatorMode.One:
return ObjValidator1();
case ObjValidatorMode.Two:
return ObjValidator2(this.settings);
}
}
}
class ObjValidator1: IObjValidator
{
public bool Validate()
{
// Do stuff.
}
}
class ObjValidator2: IObjValidator
{
private readonly ISettings settings;
public ObjValidator2(ISettings settings)
{
this.settings = settings;
}
public bool Validate()
{
// Use ISettings field data here.
}
}
很好解釋了答案,我同意除了這一點:設置工廠似乎是過度殺傷(在我的情況下),因爲將只有一個設置,在應用程序會話開始時創建並傳遞給ObjValidatorFactory。我無法想到一個好處,但我歡迎被告知爲什麼我錯了。 – user2079828
@ user2079828「ISettings」接口的存在表示將來可能會有多個設置的實現可以從不同的源(文件,數據庫等)加載。如果不是的話,那麼你可以用'ISettingsFactory'做的路程,在例如ObjectValidatorFactory'的''的方法Create'直接創建'Settings'的一個實例。 – CKing
啊,是的,我明白你爲什麼現在提出這個建議。我相信ISettings完全是爲了Mocking的目的而創建的。我現在同意,正如你所指出的那樣,在工廠中創建設置是最好的主意。 – user2079828