Abstract Factory-関連する部品を組み合わせて製品を作る-
Java言語で学ぶデザインパターン入門 の第9章を参考にしました。
Abstract Factoryパターンとは
本書には以下のように記載されています。
部品の具体的な実装には注目せず、インターフェースに注目し、 そのインターフェースのみで部品を組立て、製品にまとめる
つまり、抽象的な部品を組み合わせて抽象的な製品を作る抽象的な工場を用いたデザインパターンです。
実装
こちらを参考にしてください。
登場人物
AbstractProduct役(Linkクラス、Trayクラス等)
AbstractFactory役によって作り出される抽象的な部品や製品のインターフェースを定める
AbstractFactory役(Factoryクラス)
AbstractProduct役のインスタンスを作り出すためのインターフェースを定める
Client役(Mainクラス)
AbstractProduct役とAbstractFactory役のインターフェースだけを使って仕事を行う
ConcreteProduct役(ListLinkクラス、ListTrayクラス等)
AbstractProduct役のインターフェースを実装する
ConcreteFactory役(ListFactory)
AbstractFactory役のインターフェースを実装する
実装のポイント
このサンプルプログラムは、以下の3つのパッケージに分かれている。
factoryパッケージ
抽象的な工場・部品・製品を含む
無名パッケージ
Mainクラスを含む
listfactoryパッケージ
具体的な工場・部品・製品を含む
LinkやTrayは抽象的な「部品」であり、Pageは抽象的な「製品」であります(部品を組み合わせて製品になる)。 なので。LinkクラスとTrayクラスはItemクラスを継承しており、PageクラスのaddメソッドではItem型の変数を引数に持ちます。 そして、それらを作ることができるFactoryクラスが実装されています。
Abstract Factoryパターンのメリット
Mainクラスでは、具体的な部品、製品、工場のインスタンス(ListLink等)を使っていないので、 今回使用したlistfactory以外の具体的な工場を追加することが容易です。 しかし、部品を追加するとその他の工場にもその部品を追加するメソッドを追加しなければならないので、 部品を新たに追加するのは困難です。
まとめ
Abstract Factoryパターンは、抽象的な部品を組み合わせて抽象的な製品を作る抽象的な工場を用いることで、 抽象度の高い実装を行うことが可能である。