2013-08-23 17 views
6

W mojej metodzie fabrycznej używam instrukcji Switch do tworzenia konkretnych obiektów. Powoduje to bardzo wysoką złożoność cykliczną. Oto przykładowy kod:Nie można zredukować złożoności cyklicznej w metodzie Factory bez użycia odbicia

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); 
     } 
    } 

Jak mogę to zmienić, aby zmniejszyć złożoność cykliczności? Jeśli używam odbicia do tworzenia obiektów lub czegoś innego do budowania obiektów to czy jest to lepsze niż powyższa metoda?

+0

W przypadku domyślnym próbują zwrócić wartość insted rzuca wyjątek i spróbuj AĢIN – Sumeshk

Odpowiedz

8

Jest to możliwe, aby korzystać z Dictionary usunąć oświadczenie switch całości:

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

Thanks Adi ... świetna odpowiedź teraz nie muszę korzystać z refleksji :) –

+0

Problemy z wydajnością tutaj, ponieważ fabryka musi stworzyć nową instancję każdego elementu w swoim słowniku. Najgorsze jest to, że twój słownik jest obowiązkowy, aby być statycznym, co oznacza, że ​​wszystkie tworzone przez Ciebie wystąpienia pozostaną w pamięci aż do końca twojego kodu. Obecnie szukam tego samego rozwiązania problemu bez utraty optymalizacji czasu i przestrzeni, a tego jeszcze nie znalazłem. – niconoe

+0

@niconoe Utworzone instancje nie są statyczne - zostaną zwolnione po zakończeniu ich używania. Jedyne rzeczy, które zostaną zapamiętane na zawsze, to słownik i to, co zawiera (ciągi klawiszy i funkcje tworzące wartości). –