目的
あるサブクラスと別のサブクラスを必ずペアにして使って欲しい場合使います。
効果
- 新しいサブクラスの種類を増やしていっても、仕様書やマニュアルを参照する必要がなくなるので、開発しようとしているプログラマにとって負担になりません。
- 条件に応じてnew(インスタンス化)するクラスの種類を切り替える必要がなくなるので、if文による分岐が減り、コード全体がすっきりします。
実装
Address抽象クラス作成

- 抽象クラスにする理由はサブクラスは1つではなく複数になるためです。
- Addressのサブクラスは必ずこのクラスを継承する必要があります。
Address1クラス作成

- Addressを継承していることに注目してください。
Address2クラス作成

- Address1と同様にAddressクラスを継承します。
Person抽象クラス作成

- createAddress():ファクトリメソッドです。
- createAddress戻り値の型がAddressになっていることを注意してください。
- これはオブジェクト指向の特徴のポリモーフィズムを使うことです。
Person1クラス作成

- Personクラスを継承していることに注目してください。
- createAddress戻り値の方はAddressとなっていますが、実際はAddress1のインスタンスです。
- Address1はPerson1とペアなので、Address2ではなくAddress1のインスタンスを返します。
Person2クラス作成

- Person2はAddress2とペアなのでcreateAddressの戻り値はAddress2のインスタンスになります。
Mainクラス作成

- このソースコードでAddress1クラス名が見えないことに注目してください。
- Address1を知らなくても正しいペアを選択することができているのです。
結果

結果も正常に表示されますね。
終わりに
- PersonやAddressを同じように拡張して作ってもペアのクラスの名前をいちいち調べなくても済むようになりました。
- 開発者はすごく楽に機能拡張することができるってことですね。
- これが「拡張性に強くなる」という効果です。
次回はAbstract Factory(アプストラクトファクトリ)パターンについて調べてみたいと思います。
