こちらの書籍でデザインパターンを勉強中。
また、Java ですが家にこの本もあったので並行して読み進めていきます。
デザインパターン一覧
リンクになっているものは勉強済。
- 生成に関するデザインパターン
- Abstract Factory
- Builder
- Factory Method
- Prototype
- Singleton
- 構造に関するデザインパターン
- Adapter
- Bridge
- Composite
- Decorator
- Facade
- Flyweight
- Proxy
- ふるまいに関するデザインパターン
- Chain of Responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Mememnto
- Observer
- State
- Strategy
- Template Method
- Visitor
Builder パターンの概要
Abstract Factory パターンと同じく、いくつかのオブジェクトを組み合わせて複雑なオブジェクトを生成するときに利用できるパターン。
このパターンでは主に Builder と Director という2つのクラスが登場する。
- Builder:部品となるオブジェクトの情報(部品がどうやって構成されてるか)を保持する
- Director:複雑なオブジェクトを組み立てるための作業工程を知っている Director が登場する
サンプルコードでは、(最終的に得たい)複雑なオブジェクトとしてログインフォーム画面の作成を題材にしている。
ログインフォーム画面はページタイトルやテキスト入力項目やラベルなどの部品からなる。
また、フォームは HTML で作成するものと Tkinter という Python の GUI モジュールで作成するものと2種類用意する。
クラス図
サンプルコードの例をクラス図にしてみる。
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 らしく書くためのコツ
特になし。