Python中的工厂模式

时间:2010-08-18 10:19:32

标签: python design-patterns factory factory-pattern

我目前正在使用Python实现Factory设计模式,我有几个问题。

  1. 有没有办法阻止直接实例化实际的具体类?例如,如果我有一个生成Vehicle的VehicleFactory,我希望用户只使用该工厂,并防止任何人直接意外地实例化Car()或Truck()。我可以在 init ()中抛出异常,但这也意味着工厂无法创建它的实例......

  2. 现在我觉得工厂上瘾了。似乎所有东西都应该成为工厂,这样当我改变内部实现时,客户端代码不会改变。我很想知道什么时候有实际需要使用工厂,什么时候不适合使用。例如,我可能有一个Window类,现在只有这种类型的一个(没有PlasticWindow,ReinforcedWindow或类似的东西)。在这种情况下,我是否应该使用工厂为客户端生成Window,以防万一我以后可能会添加更多类型的Windows?

  3. 我只是想知道是否有通常的方式来打电话给工厂。例如,现在我将我的车辆工厂称为车辆,因此代码将类似于Vehicles.create(...)。我看到很多教程就像VehicleFactory一样,但我发现它太长了,它也暴露了实现。

  4. 编辑:我所说的“暴露实施”是因为它让人们知道它是一个工厂。我觉得客户不需要知道它是一个工厂,而是作为一个可以为你返回对象的类(当然这是一个工厂,但也许没有必要明确告诉客户那个?)。我知道源代码很容易暴露,所以我并不是说“暴露源代码中实现功能的方式”。

    谢谢!

3 个答案:

答案 0 :(得分:22)

是Pythonic。不要使用“企业”语言(如Java)解决方案使代码过度复杂化,这些解决方案会增加不必要的抽象级别。

您的代码应该简单直观。您不应该委托另一个类来实例化另一个类。

答案 1 :(得分:11)

  1. 不要暴露该类(例如将其设为私有__MyClass,或明显不希望它直接使用_MyClass)。这样它只能通过工厂函数实例化。
  2. 也许您应该检查关键字参数和继承的使用。听起来你可能会忽视这些,这通常会减少你对复杂工厂的依赖(说实话,我很少需要工厂)。
  3. 在Python中,您无法轻易防止暴露实施,它违反了Zen of Python。 (在任何语言中都是一样的,一个坚定的个人最终可以得到他们想要的东西)。最多应该尝试确保代码的用户不会意外做错事,但绝不会假设知道最终用户可能决定使用您的代码实现什么。不要让它混淆并且难以使用。

答案 2 :(得分:5)

  

有没有办法阻止直接实例化实际的具体类?

为什么呢?您的程序员是否是拒绝遵守规则的邪恶反社会人士?如果你提供工厂 - 工厂做人们需要的 - 那么他们就会使用工厂。

你无法“阻止”任何事情。记得。这是Python - 他们有源。

  

我应该使用工厂为客户端生成Window,以防万一我将来可能会添加更多类型的Windows吗?

咩。既不好也不坏。管理所有类层次结构和工厂细节可能会很麻烦。

添加工厂并不难。这是Python - 您始终拥有所有源代码 - 您可以使用grep查找类构造函数,并在需要时将其替换为工厂。

由于您可以使用grep来查找和修复您的错误,因此您无需像在Java或C ++中那样预先计划此类事情。

  

我看到很多教程就像VehicleFactory一样,但我发现它太长了,它也暴露了实现。

“太长了”?它的使用很少,几乎不重要。使用长名称 - 它可以帮助其他人了解您正在做的事情。这不是代码高尔夫,其中击键次数最少。

“公开实施”?首先,它没有任何暴露。其次,这是Python - 您始终拥有所有来源 - 所有内容都已暴露。

不要再考虑预防和隐私了。这没用。