4. 适用性
在下列情况下可以使用Factory Method模式:
• 当一个类不知道它所必须创建的对象的类的时候。
当一个类需要创建某种对象却无法事先知道它的类型信息的时候。例如前文提到的应用/文档架构。这个架构的使用者是开发人员,开发的应用也成千上万,架构的提供者当然没有办法知道需要创建对象的类型。可以使用工厂方法模式决定所要创建的对象类型。
这种情况是真不知道。
• 当一个类希望由它的子类来指定它所创建的对象的时候。
如果我们的设计面向的不是通用的架构,只是一个具体的应用场景,那么大多数情况下我们可以知道(至少是知道大部分)需要创建对象的具体类型。但是出于某种考虑(将来的扩展,分散开发的需求等等),仍然希望将创建实际对象的职责交给其子类。
这种情况是装不知道。
• 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
这句话很难理解,还是看原文。
classes delegate responsibility to one of several helper subclasses, and
you want to localize the knowledge of which helper subclass is the delegate.
原文前半句中委托的职责并没有明确指出是创建对象的职责,很大的可能是翻译不准确。以下结合实例说明作者的理解,类图如下:
我们的例子是图形编辑软件,支持Rect和Circle两种图形,它们都是Shape类的子类。另外,由于某种原因(例如我们希望将来图形可以在不同的操作系统中表示)我们希望将它们的图形的描画功能委托给RectDrawer和CircleDrawer两个帮助子类。如上图所示,由于使用了工厂方法模式创建不同的Drawer子类。关于描画功能具体委托给了哪个Drawer子类的信息都被限制在了具体的图形子类中。
作者观点
有选择的装不知道可以作为设计架构的出发点。
注:
本文中
蓝 {MOD}粗体文字都引自《设计模式》一书。
觉得本文有帮助?请分享给更多人。
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】