Python 使用工厂与常规构造函数的优缺点
(使用Python 3.2,但我怀疑这是否重要。) 我有Python 使用工厂与常规构造函数的优缺点,python,oop,inheritance,design-patterns,class-factory,Python,Oop,Inheritance,Design Patterns,Class Factory,(使用Python 3.2,但我怀疑这是否重要。) 我有类数据,类规则,类结果。我使用小写字母表示该类的一个实例 规则对象包含的规则如果应用于数据对象,可以创建结果对象 我正在决定将(相当复杂和不断发展的)代码放在哪里,这些代码实际上将规则应用于数据。我可以看到两种选择: 将该代码放入类Result方法中,比如说parse\u rulesResult构造函数将把rules对象作为参数,并将其传递给self.parse\u rules 将该代码放入一个新类ResultFactoryResultFa
类数据
,类规则
,类结果
。我使用小写字母表示该类的一个实例
规则
对象包含的规则如果应用于数据
对象,可以创建结果
对象
我正在决定将(相当复杂和不断发展的)代码放在哪里,这些代码实际上将规则应用于数据。我可以看到两种选择:
Result
方法中,比如说parse\u rules
Result
构造函数将把rules
对象作为参数,并将其传递给self.parse\u rules
ResultFactory
ResultFactory
将是一个单例类,它有一个方法,比如build\u result
,该方法将规则
作为参数,并返回一个新生成的result
对象- B的实例包含或复合聚合A的实例
- B的实例记录A的实例
- B的实例紧密地使用A的实例
- B实例具有A实例的初始化信息,并在创建时传递该信息
简而言之,ResultFactory似乎是一个合理的地方,可以集中知识,了解如何将规则应用于数据以生成结果。如果您试图将所有这些逻辑推送到类构造函数中以获得结果或规则,则会导致紧密耦合和内聚性的丧失。好吧,第二个是非常愚蠢的,尤其是在所有单元素的情况下。如果
Result
需要Rules
来创建实例,而没有它您就无法创建实例,那么它应该将此作为\uuuuuuu init\uuuu
的参数。无需模式购物。为什么不将规则放在他们自己的类中?如果您创建一个规则基类,那么每个规则都可以从中派生。这样,当数据需要应用规则时,可以使用多态性。数据不需要知道或关心应用了哪些规则实例(除非数据本身知道应该应用哪些规则)
当需要调用规则时,数据实例可以调用所有RuleBase.ExecuteRules()并将自身作为参数传入。如果数据知道需要哪个规则,则可以直接从数据中选择规则的正确子类。或者可以使用其他一些设计模式,比如责任链,其中数据调用该模式并返回结果
这将是一个很好的白板讨论。你能让ResultFactory成为一个纯函数吗?如果您只需要一个函数,那么创建单例对象是没有用的。第三种情况:
你可能想考虑第三种情况:
- 将代码放入方法
规则中。\uuuu调用\uuuu
实例化
类似:Result
Result=规则(数据)
s可能完全不知道生成它们的结果
规则(甚至可能不知道原始
)数据
- 每个
子类都可以自定义其规则
创建结果
- (对我来说)这感觉很自然:
应用于规则
产生数据
结果
- 你将掌握一些原则:
- 创建者:规则的实例具有结果的实例的初始化信息,并在创建时传递
- 信息专家:信息专家将负责将履行职责所需的大部分信息交给班级
- 耦合:您将提高
和规则
之间的耦合:数据
- 您需要将整个数据集传递给每个
规则
- 这意味着每个
都应该能够决定将应用哪些数据规则
- 您需要将整个数据集传递给每个
规则
转换为工厂可能是一种选择,如果您可以通过构造函数传递所有数据来分别创建结果
实例。但是如果您总是需要规则
来创建结果
,那么它应该是一个ctor参数;我没有提到它,但是Rules
是大型类层次结构的根。因此,如果我想将转换代码放入规则中,我当然可以将其放入这个层次结构的根中。感谢链接,我现在正在阅读Craig Larman的《它引用的书》。也许我误解了什么,但在我看来,Creator模式理所当然地认为A类实例是在A的构造函数中创建的,并且只讨论了哪个类应该调用该构造函数?请告诉我您的想法,以及是否可以解决您的问题。我仍然不确定什么是有效的;当我更好地理解时,我会更新。