デザインパターン2

Page content

8 Abstract Factory

抽象的な部品を組み合わせて抽象的な製品を作る

実装

抽象的な部品

Item

link と tray のスーパークラス link と tray を同一視するためのクラス caption field はこの項目の見出し makehtml method は抽象メソッドで html の文字列が返り値となるようサブクラスで実装

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 を実装

具体的な部品

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 に新たな部品を追加しようとすると具体的な工場全てに修正加えなければならない

参考

オブジェクト指向でなぜつくるのか 第 3 版 知っておきたい OOP、設計、アジャイル開発の基礎知識