dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

『実践 Python 3』で学ぶデザインパターン : Builderパターン

こちらの書籍でデザインパターンを勉強中。

また、Java ですが家にこの本もあったので並行して読み進めていきます。

デザインパターン一覧

リンクになっているものは勉強済。


Builder パターンの概要

Abstract Factory パターンと同じく、いくつかのオブジェクトを組み合わせて複雑なオブジェクトを生成するときに利用できるパターン。

このパターンでは主に Builder と Director という2つのクラスが登場する。

  • Builder:部品となるオブジェクトの情報(部品がどうやって構成されてるか)を保持する
  • Director:複雑なオブジェクトを組み立てるための作業工程を知っている Director が登場する

サンプルコードでは、(最終的に得たい)複雑なオブジェクトとしてログインフォーム画面の作成を題材にしている。
ログインフォーム画面はページタイトルやテキスト入力項目やラベルなどの部品からなる。

また、フォームは HTML で作成するものと Tkinter という PythonGUI モジュールで作成するものと2種類用意する。

クラス図

サンプルコードの例をクラス図にしてみる。

f:id:dackdive:20160126184741p:plain

Builder は抽象クラスで、最終的に生成したいオブジェクトの構成要素を生成するのに必要なメソッドのインターフェースだけを定義する。

具体的な実装はこの抽象クラスを継承したそれぞれの XXXBuilder クラスに任せる。

また、Director クラスは Builder クラスのインスタンスを受け取り、Builder クラスに定義されたメソッドを呼び出して構成部品を生成し、複雑なオブジェクトを生成する。
Java だと builder が Directorインスタンス変数になっているが本質的な違いはないと思う

コードの利用者は生成したいフォームの種類(HTML か Tkinter か)を決めてふさわしい Builder クラスを Director に渡し、フォーム生成用のメソッド create_login_form() を実行すれば良い。


コード

https://github.com/zaki-yama/python-in-practice/tree/master/chapter-1/Builder


特徴

これは『Java 言語で学ぶデザインパターン入門』に書いてあったことなのだが、
「誰が何を知っているか」 に注目してこのパターンを見てみると理解しやすい。

このパターンの利用者は Builder クラスの各メソッドを知らない。
言い換えると、必要としている複雑なオブジェクトの生成アルゴリズムを知らない
それは Director クラスが知っていることで、Director クラスだけを使えば良い。

次に、Director クラスからすると
Builder が提供するインターフェースは知っているが、構成部品を生成するための具体的な処理については知らない
また、自分が利用する Builder クラスが本当はどの具象クラスなのかも知らない。
あくまで Builder クラスのメソッドだけを呼び出して必要なパーツを取得し、複雑なオブジェクトを生成している。


Python らしく書くためのコツ

特になし。