目录
意图
- 定义一个用于创建对象的接口,但让子类决定要实例化哪个类。工厂方法允许类将实例化推迟到子类。
- 定义一个“虚拟”构造函数。
new
运营商认为有害。
问题
框架需要为一系列应用程序标准化架构模型,但允许各个应用程序定义自己的域对象并提供它们的实例化。
讨论
工厂方法是创建对象,就像模板方法是实现算法一样。超类指定所有标准和通用行为(使用纯虚拟“占位符”进行创建步骤),然后将创建细节委托给客户端提供的子类。
工厂方法使设计更具可定制性,只是稍微复杂一点。其他设计模式需要新的类,而工厂方法只需要新的操作。
人们经常使用工厂方法作为创建对象的标准方式;但在以下情况下没有必要:被实例化的类永远不会改变,或者实例化发生在子类可以轻松覆盖的操作中(例如初始化操作)。
工厂方法类似于抽象工厂,但不强调家庭。
工厂方法通常由架构框架指定,然后由框架的用户实施。
结构
四人组(下)中讨论的工厂方法的实现在很大程度上与抽象工厂的实现重叠。出于这个原因,本章中的演示将重点介绍自那以后变得流行的方法。

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

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

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

检查清单
- 如果您有一个执行多态性的继承层次结构,请考虑通过
static
在基类中定义工厂方法来添加多态创建功能。 - 设计工厂方法的参数。哪些品质或特征是必要且足以识别正确的派生类以进行实例化的?
- 考虑设计一个内部“对象池”,允许对象被重用,而不是从头开始创建。
- 考虑制作所有构造函数
private
或protected
.
经验法则
- 抽象工厂类通常使用工厂方法实现,但它们可以使用原型来实现。
- 工厂方法通常在模板方法中调用。
- 工厂方法:通过继承创建。原型:通过委托创建。
- 通常,设计从使用工厂方法(不太复杂、更可定制、子类激增)开始,然后随着设计人员发现需要更多灵活性的地方而向抽象工厂、原型或构建器(更灵活、更复杂)发展。
- Prototype 不需要子类化,但它确实需要 Initialize 操作。工厂方法需要子类化,但不需要初始化。
- 工厂方法的优点是它可以多次返回同一个实例,或者可以返回一个子类而不是那个确切类型的对象。
- 一些工厂方法的倡导者建议,作为语言设计的问题(或者作为风格问题),绝对所有的构造函数都应该是私有的或受保护的。一个班级是制造新物品还是回收旧物品,与其他人无关。
new
运营商认为有害。请求对象和创建对象是有区别的。操作者new
总是创建一个对象,并且无法封装对象创建。工厂方法强制执行该封装,并允许请求对象而无需与创建行为密不可分地耦合。
本文来自转载,原文链接: