2013-08-23 52 views
6

在我的工廠方法中,我使用Switch語句來創建具體對象。這導致非常高的圈複雜度。這裏是一個示例代碼:無法在不使用反射的情況下減少工廠方法中的圈複雜度

private static UnitDescriptor createUnitDescriptor(string code) 
{ 
    switch (code) 
    { 
     case UnitCode.DEG_C: 
      return new UnitDescriptorDegC(); 

     case UnitCode.DEG_F: 
      return new UnitDescriptorDegF(); 

     : 
     : 
     default: 
      throw new SystemException(string.format("unknown code: {o}", code); 
     } 
    } 

我該如何重構這個以減少圈複雜度?如果我使用反射來創建對象或其他東西來構建對象比上面的方法更好嗎?

+0

在默認的情況下試圖返回一個值insted的拋出異常,並嘗試阿恩 – Sumeshk

回答

8

它可能爲你使用Dictionary完全去除switch聲明:

class MyClass 
{ 
    private static Dictionary<string, Func<UnitDescriptor>> dict = new Dictionary<string, Func<UnitDescriptor>>(); 

    static MyClass() 
    { 
     dict.Add(UnitCode.DEG_C,() => new UnitDescriptorDegC()); 
     dict.Add(UnitCode.DEG_F,() => new UnitDescriptorDegF()); 
     // Other mappings... 
    } 

    private static UnitDescriptor createUnitDescriptor(string code) 
    { 
     Func<UnitDescriptor> value; 
     if (dict.TryGetValue(code, out value)) 
     { 
      return value(); 
     } 

     throw new SystemException(string.Format("unknown code: {0}", code)); 
    } 
} 
+0

感謝阿迪...偉大的答案,現在我不必使用反射:) –

+0

性能問題在這裏,因爲您的工廠需要在您的詞典中創建每個元素的新實例。最糟糕的是,您的詞典必須是靜態的,這意味着您創建的所有實例都將保留在內存中直到代碼結束。 我目前正在尋找相同的解決方案來解決您的問題,而不會損失時間和空間的優化,而且我還沒有找到。 – niconoe

+0

@niconoe創建的實例不是靜態的 - 當您完成使用時,它們將被釋放。唯一會永遠保存在內存中的東西就是字典和它所擁有的東西(關鍵字符串和價值創造函數)。 –

相關問題