pythonによるデザインパターン[Builder]
# Intro
この文章は結城 浩さんの「Java言語で学ぶデザインパターン入門」を、pythonで実装してみたサンプルコードです。
筆者の環境は以下の通りです。Python 3.6.3
まだ修行中の身なので間違いがあると思いますがご了承ください。 今回は「Builder」です
# Explanation
本書のp82によると、 Builderとは
構造を持ったインスタンスを積み上げていく
というものです。よく分からないと思うので具体例を見た方が早いと思います。
# Practice
## Specification
python builder.py plain
と入力すると
=======================
『Greeting』■ 朝から昼にかけて- おはようございます。
- こんにちは。
■ 夜に
- こんばんは。
- おやすみなさい。
- さようなら。
=======================
と表示し、 python builder html
と入力すると
<html>
<head><title>Greeting</title></head>
<body>
<h1>Greeting</h1>
<p>朝から昼にかけて</p>
<ul>
<li>おはようございます。</li>
<li>こんにちは。</li>
</ul>
<p>夜に</p>
<ul>
<li>こんばんは。</li>
<li>おやすみなさい。</li>
<li>さようなら。</li>
</ul>
</body>
</html>
と表示するようなコード(面倒なのでhtmlの方の改行は除きます)。
どちらのフォーマットも同じ文章・同じ形式で、
- タイトルを1つ含む
def make_title
- 文字列をいくつか含む
def make_string
- 箇条書きの項目をいくつか含む
def items
- 文章を終了する
def close
の一連の流れを抽象クラス( class Builder
)の抽象メソッドにまとめます。
その上で、 class Builder
のサブクラスとして、上のフォーマットの場合はplane textを表示するclass TextBuilder
を、下のフォーマットの場合はhtmlを生成するclass HTMLBuilder
を作成します。
## sample code
## Explanation
お気づきかもしれませんが、大きな流れは template methodと同じです。
大きな違いは、具体的な文章の内容をサブクラスで決めるのではなく、 class Director
の def construct
で決定することです。 def construct
では class Builder
から呼び出しているので、実際に実行しているのが class TextBuilder
なのか class HTMLBuilder
なのか気にする必要がないです。つまりサブクラスを入れ替えることができ、部品として再利用しやすい形となります(交換可能性 — p92)。
# Conclusion
注意しなくてはいけないのは、表示する文章の形式( class Builder
のサブクラス)が増えるほど、 class Builder
を改変する必要が高まってくることです。例えば、xml形式、json形式で表示する場合、今の class Builder
にメソッドを追加しなければなりません。
このデザインパターンはオブジェクト指向の美しさを垣間見れた気がします。様々なclassを適切に分割し、抽象クラスを用いることで、コードの部品化や再利用化が綺麗に構成されますね。
# ref
- 「増補改訂版 Java言語で学ぶデザインパターン入門」 結城浩(著)第11版