1. 人人编程首页
  2. 架构设计

工厂方法设计模式

意图

  • 定义一个用于创建对象的接口,但让子类决定要实例化哪个类。工厂方法允许类将实例化推迟到子类。
  • 定义一个“虚拟”构造函数。
  • new运营商认为有害。

问题

框架需要为一系列应用程序标准化架构模型,但允许各个应用程序定义自己的域对象并提供它们的实例化。

讨论

工厂方法是创建对象,就像模板方法是实现算法一样。超类指定所有标准和通用行为(使用纯虚拟“占位符”进行创建步骤),然后将创建细节委托给客户端提供的子类。

工厂方法使设计更具可定制性,只是稍微复杂一点。其他设计模式需要新的类,而工厂方法只需要新的操作。

人们经常使用工厂方法作为创建对象的标准方式;但在以下情况下没有必要:被实例化的类永远不会改变,或者实例化发生在子类可以轻松覆盖的操作中(例如初始化操作)。

工厂方法类似于抽象工厂,但不强调家庭。

工厂方法通常由架构框架指定,然后由框架的用户实施。

结构

四人组(下)中讨论的工厂方法的实现在很大程度上与抽象工厂的实现重叠。出于这个原因,本章中的演示将重点介绍自那以后变得流行的方法。

工厂方法设计模式

越来越流行的工厂方法定义是:一个 static类的方法,它返回该类类型的对象。但与构造函数不同,它返回的实际对象可能是子类的实例。与构造函数不同,可以重用现有对象,而不是创建新对象。与构造函数不同,工厂方法可以有不同且更具描述性的名称( Color.make_RGB_color(float red, float green, float blue)例如 Color.make_HSB_color(float hue, float saturation, float brightness)

工厂方法设计模式

客户端与派生类的实现细节完全分离。现在可以进行多态创建。

工厂方法设计模式

例子

工厂方法定义了一个用于创建对象的接口,但让子类决定要实例化哪些类。注塑机展示了这种模式。塑料玩具制造商加工塑料成型粉,并将塑料注入所需形状的模具中。玩具的类别(汽车、人偶等)由模具决定。

工厂方法设计模式

检查清单

  1. 如果您有一个执行多态性的继承层次结构,请考虑通过 static在基类中定义工厂方法来添加多态创建功能。
  2. 设计工厂方法的参数。哪些品质或特征是必要且足以识别正确的派生类以进行实例化的?
  3. 考虑设计一个内部“对象池”,允许对象被重用,而不是从头开始创建。
  4. 考虑制作所有构造函数private或 protected.

经验法则

  • 抽象工厂类通常使用工厂方法实现,但它们可以使用原型来实现。
  • 工厂方法通常在模板方法中调用。
  • 工厂方法:通过继承创建。原型:通过委托创建。
  • 通常,设计从使用工厂方法(不太复杂、更可定制、子类激增)开始,然后随着设计人员发现需要更多灵活性的地方而向抽象工厂、原型或构建器(更灵活、更复杂)发展。
  • Prototype 不需要子类化,但它确实需要 Initialize 操作。工厂方法需要子类化,但不需要初始化。
  • 工厂方法的优点是它可以多次返回同一个实例,或者可以返回一个子类而不是那个确切类型的对象。
  • 一些工厂方法的倡导者建议,作为语言设计的问题(或者作为风格问题),绝对所有的构造函数都应该是私有的或受保护的。一个班级是制造新物品还是回收旧物品,与其他人无关。
  • new运营商认为有害。请求对象和创建对象是有区别的。操作者new 总是创建一个对象,并且无法封装对象创建。工厂方法强制执行该封装,并允许请求对象而无需与创建行为密不可分地耦合。

本文来自转载,原文链接:

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注