使用工厂与常规构造函数的利弊

max*_*max 9 python architecture oop design-patterns class-factory

(使用Python 3.2,虽然我怀疑它很重要.)

我有class Data,class Rules和类Result.我使用小写来表示类的实例.

rules对象包含,如果施加到一个规则data对象,可以创建一个result对象.

我决定在哪里放置实际将规则应用于数据的(相当复杂和不断发展的)代码.我可以看到两个选择:

  1. 把那些代码放在一个类Result方法中,比如说parse_rules.Result构造函数将rules对象作为参数,并将其传递给self.parse_rules.

  2. 将该代码放在一个新类中ResultFactory.ResultFactory将是一个单例类,它有一个方法,比如说build_result,它接受rules一个参数并返回一个新构建的result对象.

这两种方法的优点和缺点是什么?

Ray*_*ger 3

GRASP设计原则为面向对象设计中的类和对象分配职责提供了指导。例如,创建者模式建议:一般来说,如果满足以下一项或多项(最好是多项),则类 B 应该负责创建类 A 的实例:

  • B 的实例包含或复合聚合 A 的实例
  • B 的实例记录 A 的实例
  • B 的实例密切使用 A 的实例
  • B 的实例具有 A 实例的初始化信息,并在创建时传递它。

在您的示例中,您有复杂且不断发展的代码,用于将规则应用于数据。这表明使用工厂模式

将代码放入结果中是禁忌的,因为 1) 结果不会创建结果,2) 结果不是信息专家(即,他们不具备所需的大部分知识)。

简而言之,ResultFactory似乎是一个合理的地方,可以集中有关如何将规则应用于数据以生成结果的知识。如果您尝试将所有这些逻辑推入结果或规则的类构造函数中,则会导致紧密耦合和内聚力丧失。