工場には、状況によってはエレガントなアプリケーション設計を可能にする多くの利点があります。1つは、後で作成するオブジェクトのプロパティを、ファクトリを作成して1か所で設定し、そのファクトリを渡すことができることです。しかし、多くの場合、実際にそれを行う必要はありません。その場合、Factoryを使用すると、実際に見返りを与えることなく、複雑さが追加されます。たとえば、このファクトリーを見てみましょう。
WidgetFactory redWidgetFactory = new ColoredWidgetFactory(COLOR_RED);
Widget widget = redWidgetFactory.create();
Factoryパターンに代わるものの1つは、非常によく似たBuilderパターンです。主な違いは、Factoryが初期化されると、Factoryによって作成されたオブジェクトのプロパティが設定され、Builderはデフォルト状態で初期化され、その後すべてのプロパティが設定されることです。
WidgetBuilder widgetBuilder = new WidgetBuilder();
widgetBuilder.setColor(COLOR_RED);
Widget widget = widgetBuilder.create();
しかし、オーバーエンジニアリングが問題である場合、FactoryをBuilderに置き換えても、それほど改善されない可能性があります。
いずれかのパターンの最も簡単な置換は、もちろん、new
演算子を使用した単純なコンストラクターでオブジェクトインスタンスを作成することです。
Widget widget = new ColoredWidget(COLOR_RED);
ただし、コンストラクターには、ほとんどのオブジェクト指向言語で重大な欠点があります。つまり、コンストラクターはその正確なクラスのオブジェクトを返す必要があり、サブタイプを返すことはできません。
実行時にサブタイプを選択する必要があるが、そのためにまったく新しいBuilderクラスまたはFactoryクラスを作成したくない場合は、代わりにfactory-methodを使用できます。これは、そのクラスまたはそのサブクラスの1つの新しいインスタンスを返すクラスの静的メソッドです。内部状態を保持しないファクトリは、多くの場合、次のようなファクトリメソッドに置き換えることができます。
Widget widget = Widget.createColoredWidget(COLOR_RED); // returns an object of class RedColoredWidget
Java 8の新機能は、ステートレスファクトリで行うのと同じように、メソッドを渡すことができるメソッド参照です。便利なことに、メソッド参照を受け入れるものはすべて、同じ機能的なインターフェースを実装するオブジェクトも受け入れます。これは、内部状態を備えた本格的なファクトリーでもあります。