2017-10-12 85 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