デザインパターン2
8 Abstract Factory
抽象的な部品を組み合わせて抽象的な製品を作る
実装
抽象的な部品
Item
link と tray のスーパークラス link と tray を同一視するためのクラス caption field はこの項目の見出し makehtml method は抽象メソッドで html の文字列が返り値となるようサブクラスで実装
Link
html のハイパーリンクを抽象的に表現したクラス url field はリンクの飛び先 url makehtml を実装してないので抽象クラス
Tray
複数の link や tray を集めてひとまとまりにしたもの link や tray を add method で集める。それらの super class である item を引数にとる makehtml を実装してないので抽象クラス
抽象的な製品
Page
html ページ全体を抽象的に表現したクラス link や tray が抽象的な部品であるなら page は抽象的な製品 title field はページのタイトル author はページの作者 add method で item を追加する output method でタイトルを元にファイル名を決定し makeHTML method で内容をファイルに書き込む makeHTMl を抽象メソッドとして定義
抽象的な工場
Factory
get_factory method はクラス名を指定して具体的な工場のインスタンスを生成するもの。ただし戻り値は抽象的な工場 create_link, tray, page の各メソッドは抽象的な工場で部品や製品を作るときに用いるメソッド 具体的な作成はサブクラスだがシグニチャ(引数の型と数)とメソッドの名前は決められている
具体的な工場
ListFactory
create_link, tray, page を実装
具体的な部品
ListLink
link のサブクラス make_html を実装
ListTray
tray のサブクラス make_html を実装。tray field の中の item を html のタグとして表現する
具体的な製品
ListPage
Page のサブクラス make_html method を実装
登場人物
AbstractProduct
抽象的な部品や製品の interface
AbstractFactory
AbstractProduct のインスタンスを作り出すためのインターフェース
Client
AbstractFactory と AbstractProduct のインターフェースだけを使って仕事を行う役
CreateProduct
AbstractProduct のインターフェースの実装をする
ConcreteFactory
AbstractFactory のインターフェースを実装
知っておくべきこと
具体的な工場を新たに追加するのは簡単
いくら具体的な工場を追加しても抽象的な工場や main 関数に修正を加える必要はない
部品を新たに追加するのは困難
AbstarctFactory に新たな部品を追加しようとすると具体的な工場全てに修正加えなければならない