我目前正在使用Python实现Factory设计模式,我有几个问题。
有没有办法阻止直接实例化实际的具体类?例如,如果我有一个生成Vehicle的VehicleFactory,我希望用户只使用该工厂,并防止任何人直接意外地实例化Car()或Truck()。我可以在 init ()中抛出异常,但这也意味着工厂无法创建它的实例......
现在我觉得工厂上瘾了。似乎所有东西都应该成为工厂,这样当我改变内部实现时,客户端代码不会改变。我很想知道什么时候有实际需要使用工厂,什么时候不适合使用。例如,我可能有一个Window类,现在只有这种类型的一个(没有PlasticWindow,ReinforcedWindow或类似的东西)。在这种情况下,我是否应该使用工厂为客户端生成Window,以防万一我以后可能会添加更多类型的Windows?
我只是想知道是否有通常的方式来打电话给工厂。例如,现在我将我的车辆工厂称为车辆,因此代码将类似于Vehicles.create(...)。我看到很多教程就像VehicleFactory一样,但我发现它太长了,它也暴露了实现。
编辑:我所说的“暴露实施”是因为它让人们知道它是一个工厂。我觉得客户不需要知道它是一个工厂,而是作为一个可以为你返回对象的类(当然这是一个工厂,但也许没有必要明确告诉客户那个?)。我知道源代码很容易暴露,所以我并不是说“暴露源代码中实现功能的方式”。
谢谢!
答案 0 :(得分:22)
是Pythonic。不要使用“企业”语言(如Java)解决方案使代码过度复杂化,这些解决方案会增加不必要的抽象级别。
您的代码应该简单直观。您不应该委托另一个类来实例化另一个类。
答案 1 :(得分:11)
__MyClass
,或明显不希望它直接使用_MyClass
)。这样它只能通过工厂函数实例化。答案 2 :(得分:5)
有没有办法阻止直接实例化实际的具体类?
为什么呢?您的程序员是否是拒绝遵守规则的邪恶反社会人士?如果你提供工厂 - 工厂做人们需要的 - 那么他们就会使用工厂。
你无法“阻止”任何事情。记得。这是Python - 他们有源。
我应该使用工厂为客户端生成Window,以防万一我将来可能会添加更多类型的Windows吗?
咩。既不好也不坏。管理所有类层次结构和工厂细节可能会很麻烦。
添加工厂并不难。这是Python - 您始终拥有所有源代码 - 您可以使用grep
查找类构造函数,并在需要时将其替换为工厂。
由于您可以使用grep
来查找和修复您的错误,因此您无需像在Java或C ++中那样预先计划此类事情。
“太长了”?它的使用很少,几乎不重要。使用长名称 - 它可以帮助其他人了解您正在做的事情。这不是代码高尔夫,其中击键次数最少。我看到很多教程就像VehicleFactory一样,但我发现它太长了,它也暴露了实现。
“公开实施”?首先,它没有任何暴露。其次,这是Python - 您始终拥有所有来源 - 所有内容都已暴露。
不要再考虑预防和隐私了。这没用。