【发布时间】:2011-03-31 11:24:06
【问题描述】:
我目前正在用 Python 实现工厂设计模式,我有几个问题。
有什么方法可以防止直接实例化实际的具体类?例如,如果我有一个生成 Vehicles 的 VehicleFactory,我希望用户只使用该工厂,并防止任何人意外地直接实例化 Car() 或 Truck()。我也许可以在 init() 中抛出异常,但这也意味着工厂无法创建它的实例...
现在在我看来,工厂越来越让人上瘾。似乎一切都应该成为工厂,这样当我更改内部实现时,客户端代码不会改变。我很想知道什么时候需要使用工厂,什么时候不适合使用。例如,我可能有一个 Window 类,而现在只有一个这种类型(没有 PlasticWindow、ReinforcedWindow 或类似的东西)。在这种情况下,我是否应该为客户端使用工厂来生成 Window,以防我将来可能添加更多类型的 Windows?
我只是想知道是否有一种通常的方式来调用工厂。例如,现在我将我的 Vehicle 工厂称为 Vehicles,因此代码将类似于 Vehicles.create(...)。我看到很多教程都在做类似 VehicleFactory 的教程,但我觉得它太长了,而且有点暴露了实现。
编辑:我所说的“公开实施”的意思是它让人们知道它是一个工厂。我的感觉是客户不需要知道它是一个工厂,而是作为一个可以为你返回对象的类(当然这是一个工厂,但也许没有必要明确告诉客户?)。我知道源代码很容易暴露,所以我不是说“暴露源代码中的功能实现方式”。
谢谢!
【问题讨论】:
-
您的命名约定非常混乱。 Vehicles 听起来像是车辆对象的集合,Vehicles.create() 听起来像是在制作 Vehicles 对象,而不是 Vehicle 对象。
-
是的,这是真的。我会重命名它。关于我应该如何命名它的任何建议?我真的应该去 VehicleFactory 吗?
-
“让人们知道这是一家工厂”。无论如何,他们会发现的。你想保守什么秘密?为什么这个秘密如此重要?
-
我想这里有很多误解和误解。认为我没有很清楚地表达这一点。我只是说客户不必将其视为工厂,我并不是说客户必须不知道它是工厂。这不是什么秘密。无论如何,没有问题,我将其命名为 VehicleFactory。感谢您的回复!
-
@chaindriver:有些人选名字不好;他们不使用“工厂”。您不必重复他们的错误。
标签: python design-patterns factory factory-pattern