簡體   English   中英

將工廠方法委托給抽象類

[英]Delegate factory method to abstract class

根據Factory Method模式 ,我們將對象創建委托給一個單獨的類。 假設我有抽象類A和一些實現器。 通過反射從配置文件中加載實現,因此我們仍然使用A類型進行操作。我想知道在抽象類中創建靜態創建方法是否存在任何問題。 任何意見? 這樣做的好處是不需要其他類。 您可能會爭辯說,除了主要功能之外,它還負有創建子類型對象的責任-真的違反SOLID的S原理嗎?

public abstract class A
{
 // Some abstract stuff

 public static A CreateInstance()
 {
   Type type = GetTypeFromConfig(); // pseudo method
   return (A)Activator.CreateInstance(type);  
 }
}

我不確定您的實現是否屬於Factory Method:

定義用於創建對象的接口,但讓子類決定實例化哪個類。 Factory方法允許類延遲其用於子類的實例化。

https://en.wikipedia.org/wiki/Factory_method_pattern

在這里,您的CreateInstance()方法不是在具體的類中派生的,它僅在類層次結構的頂部獲得單個實現。

此外,它還有一個主要缺點-該方法是靜態的。 基本上,這意味着每個想要將生成的對象凍結為A的任意子類型的單元測試都必須在其配置文件中指定該子類型。 在整個測試項目中,子類型將相同。

使用非靜態方法(僅在單獨的專用Factory類中才有意義),您可以更輕松地處理該對象生成器的不同實現-例如使用存根。

編輯:是的,現在有了更清晰的代碼。

SRP已通過A的另一個功能進行了驗證-可以肯定。

而且,當有人試圖使用您的工廠來創建配置文件中定義但不是從A派生的類的實例時,我會擔心所有這些情況。這當然會導致強制轉換異常。

我可以輕易地想象,在幾個星期或幾個月之后的一個相對較大的項目中,有人將編輯此配置文件並在其中引起強制轉換異常。

這樣您就 擺脫了靜態類型控制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM