2017-10-12 55 views
1

我有一些數據,我試圖篩選,我無法弄清楚這樣做的一個聰明的方式。比方說,我有3種類型:避免工廠類中的多個if-else語句[語言不可知]

A,B,C和他們都當我創建一個工廠,只是創建並返回和S型的對象擴展類S.

,好像這將是非常程序化。工廠的僞代碼的執行將是這樣的:

class Factory { 
    func create_obj(input_data) -> S { 
     if type(input_data) is A { 
      return A() 
     } 
     else if type(input_data) is B { 
      return B() 
     } 
     else { 
      return C() 
     } 
    } 
} 

現在,我有很多不同的數據類型,它很可能只。這意味着這種算法在最壞的情況下是二次方的。是否有更好的解決方案,設計模式或我可以看到的任何優化?更具體地說,我創建了某些數據類型的實例,輸入是文本行。

回答

3

解決此問題的一種方法是使用預填充的associative array,其中鍵是表示文件中的行/值的string,並且該值是應該爲該行返回的對象。

樣品實施:

file是asscociateive陣列。在啓動時,工廠應預填充此數組對象映射:

files["A"] = new A(); 
files["B"] = new B(); 
files["C"] = new C(); 

工廠然後可以通過一個其將關聯數組中查找,以獲取相應的預填充物:

func create_obj(input_data) -> S { 
    return files[input_data]; 
} 
+0

請注意,此解決方案意味着你總是得到相同的一個實例 – 2017-10-14 08:25:33

+0

人們可以輕鬆地擴展這個解決方案總是返回一個新的實例,有幾種方法來實現這一目標取決於所使用的語言。解決方案的癥結在於,使用關聯數組來避免工廠類中的if-else。 – CKing

+0

是的,當然,這只是一句話 – 2017-10-14 11:08:34