kakke18’s blog

ゆるふわ学生エンジニア

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パターンは、抽象的な部品を組み合わせて抽象的な製品を作る抽象的な工場を用いることで、 抽象度の高い実装を行うことが可能である。