工厂具有许多优点,可以在某些情况下进行优雅的应用程序设计。一种是可以通过创建工厂来设置以后要创建的对象的属性,然后将该工厂移交给其他人。但是通常您实际上并不需要这样做。在这种情况下,使用Factory只会增加额外的复杂性,而实际上并没有给您任何回报。让我们以这个工厂为例:
WidgetFactory redWidgetFactory = new ColoredWidgetFactory(COLOR_RED);
Widget widget = redWidgetFactory.create();
Factory模式的一种替代方法是非常相似的Builder模式。主要区别在于,由工厂创建的对象的属性是在初始化工厂时设置的,而生成器是使用默认状态初始化的,而所有属性均在此后设置。
WidgetBuilder widgetBuilder = new WidgetBuilder();
widgetBuilder.setColor(COLOR_RED);
Widget widget = widgetBuilder.create();
但是当过度工程成为您的问题时,用制造商替换Factory可能不会带来太大的改善。
这两种模式中最简单的替代方法当然是使用带有new
运算符的简单构造函数来创建对象实例:
Widget widget = new ColoredWidget(COLOR_RED);
但是,构造函数在大多数面向对象的语言中有一个关键的缺点:它们必须返回该确切类的对象,而不能返回子类型。
如果您需要在运行时选择子类型,但又不想为此创建一个全新的Builder或Factory类,则可以改用工厂方法。这是类的静态方法,该方法返回该类或其子类之一的新实例。不维护任何内部状态的工厂通常可以用这种工厂方法代替:
Widget widget = Widget.createColoredWidget(COLOR_RED); // returns an object of class RedColoredWidget
Java 8中的新功能是方法引用,它使您可以像在无状态工厂中那样传递方法。方便地,任何接受方法引用的对象也将接受实现相同功能接口的任何对象,该对象也可以是具有内部状态的成熟Factory,因此,当您看到这样做的原因时,可以稍后轻松地引入它们。