2013-08-23 99 views
6

Trong phương pháp nhà máy của tôi, tôi sử dụng lệnh Chuyển đổi để tạo đối tượng cụ thể. Điều này dẫn đến độ phức tạp chu kỳ rất cao. Đây là mã mẫu:Không thể giảm độ phức tạp của chu trình trong phương thức Nhà máy mà không sử dụng phản chiếu

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

Làm cách nào để tôi có thể cấu trúc lại để giảm độ phức tạp của chu trình? Nếu tôi sử dụng sự phản chiếu để tạo ra các đối tượng hoặc cái gì đó khác để xây dựng các đối tượng thì nó có tốt hơn phương pháp trên không?

+0

Trong trường hợp mặc định cố gắng trả về một giá trị insted của ném một ngoại lệ và cố gắng agin – Sumeshk

Trả lời

8

Có thể để bạn có thể sử dụng một Dictionary để loại bỏ các tuyên bố switch hoàn toàn:

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

Cảm ơn Adi ... câu trả lời tuyệt vời, bây giờ tôi không phải sử dụng sự phản chiếu :) –

+0

Vấn đề về hiệu suất ở đây, vì nhà máy của bạn cần tạo ra một cá thể mới của mỗi phần tử trong từ điển của bạn. Tệ hơn thế, từ điển của bạn là bắt buộc phải là tĩnh, nghĩa là tất cả các trường hợp bạn sẽ tạo sẽ nằm trong bộ nhớ cho đến cuối mã của bạn. Tôi hiện đang tìm kiếm giải pháp tương tự cho vấn đề của mình mà không mất thời gian và tối ưu hóa không gian và tôi chưa tìm thấy. – niconoe

+0

@niconoe Các trường hợp đã tạo không tĩnh - chúng sẽ được giải phóng khi bạn sử dụng xong chúng. Những điều duy nhất sẽ được lưu giữ trong bộ nhớ mãi mãi là từ điển và những gì nó nắm giữ (các chuỗi khóa và các hàm tạo giá trị). –