Builder パターン試行 (3) ~基本に忠実(2)~
2008/09/24 20:30 - デザインパターン
前回に引き続き、Builder パターンの基本に忠実なコーディングをおこなうと、以下の六個のクラスを使うことになる話の第二回目。
- Main.as (ドキュメントクラス)
- Director.as (ディレクタクラス)
- Builder.as (抽象ビルダクラス)
- CircleBuilder.as (円形を描画する個別ビルダクラス)
- RectBuilder.as (方形を描画する個別ビルダクラス)
- SimpleDrawn.as (描画エンジンクラス)
今回は Builder について。
Builder
差異を持った Builder を無限に作ることで、描かれる図形のバリエーションを無限に増やす、というのが Builder というパターンです。 よって、個別のビルダクラスを必要に応じた個数コーディングすることになるわけですが、今回は CircleBuilder と RectBuilder の二つを作ることとします。
そして忘れちゃ行けない。 それら個別ビルダに共通する内容を抽出した抽象ビルダクラスも作らなければなりません(ディレクタクラスで必要になります)。
まず、ビルダクラスで何をおこなうのかということの設計から。
ビルダクラスでは以下のことをおこなうようにします。
- 図形が描かれる Shape の生成
- SimpleDrawn オブジェクトの生成
- SimpleDrawn の各メソッドへのアクセス
- 図形の描画
- 図形が描かれた Shape を返す
上記の中で個別ビルダごとに差異が発生するのは 3. の「SimpleDrawn の各メソッドへのアクセス」で、それ以外の項目は個別ビルダがどのような図形を描こうと変わりません。
よって 1、2、4、5 のコーディングは抽象ビルダでおこない、3 のコーディングは個別ビルダでおこなうことになります。
抽象ビルダ Builder
今回のコーディングでは 1 と 2 はコンストラクタで、4 は Builder.draw で、5 はBuilder. getResult でおこなうようにしました。
また、本来なら 3 に含まれる SimpleDrawn のメソッドである setTarget へのアクセスは全ビルダ共通なので、抽象ビルダのコンストラクタに含めました。
個別ビルダ CircleBuilder、RectBuilder
個別ビルダでは SimpleDrawn.set○○ へのアクセスを記述します。
内容はそれぞれのソースを参照ください。
続く。