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 Directordef constructで決定することです。 def construct では class Builder から呼び出しているので、実際に実行しているのが class TextBuilder なのか class HTMLBuilder なのか気にする必要がないです。つまりサブクラスを入れ替えることができ、部品として再利用しやすい形となります(交換可能性 — p92)。

# Conclusion

注意しなくてはいけないのは、表示する文章の形式( class Builderのサブクラス)が増えるほど、 class Builder を改変する必要が高まってくることです。例えば、xml形式、json形式で表示する場合、今の class Builder にメソッドを追加しなければなりません。

このデザインパターンはオブジェクト指向の美しさを垣間見れた気がします。様々なclassを適切に分割し、抽象クラスを用いることで、コードの部品化や再利用化が綺麗に構成されますね。

# ref

--

--