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