Abstract Factory パターン

出典: フリー百科事典『ウィキペディア(Wikipedia)』

Abstract Factory パターン(アブストラクト・ファクトリ・パターン)[1]とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。 関連するインスタンス群を生成するための API を集約することによって、利用側がインスタンス群をまとめて変えられるようにし、さらに組み合わせ方を間違えないようにする[1]。日本語では「抽象的な工場」と翻訳される事が多い。

Kit パターンとも呼ばれる[1]

クラス図[編集]

Abstract Factory パターンのクラス図を以下に挙げる。

Product1, Product2 は抽象クラスであり、ConcreteProduct1, ConcreteProduct2 はそれぞれを継承した具象クラスである。抽象クラス AbstractFactory は、抽象クラス Product1, Product2 を生成するメソッドを持つ。クラス ConcreteFactory は AbstractFactory を継承し、具象クラス ConcreteProduct1, ConcreteProduct2 を生成するメソッドを持つ。ClientクラスはAbstractFactoryのインターフェースを通じて、ConcreteFactoryのインスタンスを使い、ConcreteProduct1や2のインスタンスを得る。ClientクラスはProduct1や2のインターフェースを通じてConcreteProduct1や2のインスタンスを利用する
Product1, Product2 は抽象クラスであり、ConcreteProduct1, ConcreteProduct2 はそれぞれを継承した具象クラスである。抽象クラス AbstractFactory は、抽象クラス Product1, Product2 を生成するメソッドを持つ。クラス ConcreteFactory は AbstractFactory を継承し、具象クラス ConcreteProduct1, ConcreteProduct2 を生成するメソッドを持つ。ClientクラスはAbstractFactoryのインターフェースを通じて、ConcreteFactoryのインスタンスを使い、ConcreteProduct1や2のインスタンスを得る。ClientクラスはProduct1や2のインターフェースを通じてConcreteProduct1や2のインスタンスを利用する

利用例[編集]

応用例[編集]

DOM は Abstract Factory パターンを応用した API の一つである。参考までに、クラス図との対応関係を示す。

AbstractFactory
org.w3c.dom.Document
AbstractFactory#createProduct()
org.w3c.dom.Document#createElement(String), org.w3c.dom.Document#createTextNode(String) など
Product
org.w3c.dom.Element, org.w3c.dom.Text など

関連するパターン[編集]

生成するProductを変更する手法としては、AbstractFactoryクラスがfactory method(Factory Method パターンを参照)を持ち、それを個々のConcreteFactoryが上書きする手法が一般的である。しかし、Prototype パターンを使い、prototypeとなるオブジェクトの変更により生成するProductを変える手法もある[1]

ConcreteFactoryは、singletonオブジェクト(Singleton パターンを参照)であることもある。

Factory Method パターンとの違い[編集]

『オブジェクト指向における再利用のためのデザインパターン』においてはFactory Method パターンは「クラスパターン」に分類されている。一方Abstract Factory パターンは「オブジェクトパターン」に分類されている。

Factory Method パターンは親クラスであるCreatorクラスが子クラスであるConcreteCreatorクラスにオブジェクトの生成を委ねるという、CreatorクラスとConcreteCreatorクラスとの関連である。一方でAbstract Factory パターンは、ClientのインスタンスがConcreteFactoryのインスタンスにオブジェクトの生成を委ねるという、オブジェクト同士の関連である。

関連項目[編集]

参考文献[編集]

  1. ^ a b c d エリック・ガンマラルフ・ジョンソンリチャード・ヘルムジョン・ブリシディース(著)、グラディ・ブーチ(まえがき)、本位田真一、吉田和樹(監訳)、『オブジェクト指向における再利用のためのデザインパターン』、ソフトバンクパブリッシング、1995。ISBN 978-4-7973-1112-9.