Abstract Factory を Java で
Abstract Factory は、 生成に関するデザインパターンのひとつで、 具象クラスを指定することなく、 プロダクト (訳注: 本パターンでは、 生成されるモノのことを一般にプロダクトと呼びます) のファミリー全部を生成することを可能とします。
Abstract Factory は、 個々のプロダクト全部を作成するためのインターフェースを定義しますが、 実際のプロダクト作成の作業は、 具象クラスに委ねられます。 ファクトリーの型 (クラス) それぞれは、 特定のプロダクトの異種に対応します。
クライアント・コードは、 コンストラクター呼び出し (new
演算子) で直接プロダクトを作成する代わりにファクトリー・オブジェクトの作成メソッドを呼び出します。 ファクトリーはプロダクトの特定の異種に対応しているため、 すべてのプロダクトには互換性があります。
クライアント・コードは、 その抽象インターフェイスを通じてのみファクトリーやプロダクトとやりとりします。 このため、 クライアント・コードはファクトリー・オブジェクトによって作成された任意のプロダクトの異種と動作します。 プログラマーがやるべきことは、 新しい具象ファクトリー・クラスを作成し、 それをクライアント・コードに渡すことです。
もし各種ファクトリー系のパターンやコンセプトの違いで迷った場合は、 ファクトリーの比較 をご覧ください。
複雑度:
人気度:
使用例: Abstract Factory パターンは、 Java コードではよく見かけます。 多くのフレームワークやライブラリーが、 その標準コンポーネントを拡張したりカスタマイズするためにこのパターンを使います。
Java のコア・ライブラリーでの使用例です:
見つけ方: このパターンは、 ファクトリー・オブジェクトを返すメソッドに注目すれば、 簡単に見つけられます。 そしてファクトリーを使ってサブコンポーネントが作成されます。
クロス・プラットフォーム GUI コンポーネントのファミリーとその作成方法
この例では、 ボタンとチェックボックスがプロダクトということになります。 これには macOS 用と Windows 用の 2 種類があります。
抽象ファクトリーは、 ボタンとチェックボックスを作成するためのインターフェースを定義します。 二つの具象ファクトリーがあり、 それぞれ同一種類のプロダクト二つを返します。
クライアント・コードは、 抽象インターフェースを使用してファクトリーやプロダクトと連携します。 このため、 同じクライアント・コードを使用して、 ファクトリー・オブジェクトの種類に応じて多種のプロダクトを扱うことができます。
buttons: 最初のプロダクトの階層
buttons/Button.java
buttons/MacOSButton.java
buttons/WindowsButton.java
checkboxes: 2 番目のプロダクトの階層
checkboxes/Checkbox.java
checkboxes/MacOSCheckbox.java
checkboxes/WindowsCheckbox.java
factories
factories/GUIFactory.java: 抽象ファクトリー
factories/MacOSFactory.java: 具象ファクトリー (macOS)
factories/WindowsFactory.java: 具象ファクトリー (Windows)
app
app/Application.java: クライアント・コード
Demo.java: アプリの構成
OutputDemo.txt: 実行結果