避免在工厂中使用多个 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];
}