避免在工厂中使用多个 if-else 语句 class [与语言无关]
Avoid multiple if-else statements in a factory class [language agnostic]
我有一些数据要筛选,但我想不出一个聪明的方法来做这件事。假设我有 3 种类型:
A、B、C 他们都扩展了一个 class S.
如果我创建一个只创建 returns 和 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()
}
}
}
现在,我可能有很多不同的数据类型。这意味着该算法在最坏情况下是二次时间。是否有更好的解决方案、设计模式或任何我可以查看的优化?更具体地说,我正在创建某些数据类型的实例并且输入是文本行。
解决该问题的一种方法是使用预填充的 associative array where the key is a string 代表文件中的 line/value,该值是应该为该行返回的对象。
示例实现:
设file
为关联数组。在启动时,工厂应使用 string 预填充此数组到对象映射:
files["A"] = new A();
files["B"] = new B();
files["C"] = new C();
然后可以向工厂传递一个 string,它将在关联数组中查找以获取相应的预填充对象:
func create_obj(input_data) -> S {
return files[input_data];
}
我有一些数据要筛选,但我想不出一个聪明的方法来做这件事。假设我有 3 种类型:
A、B、C 他们都扩展了一个 class S.
如果我创建一个只创建 returns 和 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()
}
}
}
现在,我可能有很多不同的数据类型。这意味着该算法在最坏情况下是二次时间。是否有更好的解决方案、设计模式或任何我可以查看的优化?更具体地说,我正在创建某些数据类型的实例并且输入是文本行。
解决该问题的一种方法是使用预填充的 associative array where the key is a string 代表文件中的 line/value,该值是应该为该行返回的对象。
示例实现:
设file
为关联数组。在启动时,工厂应使用 string 预填充此数组到对象映射:
files["A"] = new A();
files["B"] = new B();
files["C"] = new C();
然后可以向工厂传递一个 string,它将在关联数组中查找以获取相应的预填充对象:
func create_obj(input_data) -> S {
return files[input_data];
}