【问题标题】:Avoid multiple if-else statements in a factory class [language agnostic]避免在工厂类中使用多个 if-else 语句 [与语言无关]
【发布时间】:2017-10-12 03:43:33
【问题描述】:

我有一些数据要筛选,但我想不出一个聪明的方法来做这件事。假设我有 3 种类型:

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

现在,我可能有很多不同的数据类型。这意味着这个算法在最坏的情况下是二次时间的。是否有更好的解决方案、设计模式或我可以查看的任何优化?更具体地说,我正在创建某些数据类型的实例,输入是文本行。

【问题讨论】:

    标签: oop design-patterns language-agnostic


    【解决方案1】:

    解决该问题的一种方法是使用预填充的associative array,其中键是string,表示文件中的行/值,值是应为该行返回的对象。

    示例实现:

    file 成为一个关联数组。在启动时,工厂应该使用 string 预先填充这个数组到对象映射:

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

    然后可以向工厂传递一个 字符串,它将在关联数组中查找以获取相应的预填充对象:

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

    【讨论】:

    • 请注意,此解决方案意味着您始终获得相同的 A 实例
    • 可以轻松扩展此解决方案以始终返回一个新实例,根据所使用的语言,有多种方法可以实现此目的。解决方案的关键保持不变,即使用关联数组来避免工厂类中的 if-else。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多