PHPでデザインパターン「Builderパターン」
GoFデザインパターンをPHPでプログラムを書いてみながら勉強していきます。「増補改訂版 Java言語で学ぶデザインパターン入門」を参考にさせて頂いています。プログラムはGithubにあげていきます。
Builderパターンとは
builderとは、日本語で建築者、建造者という意味です。例えば家を建てる時のことを考えてみます。最終的に完成する家は、何を使って作成するかという「素材」と、どのように家を建てるかという「作成過程」によって、違ってきます。 Builderパターンとは、「素材」と「作成過程」を分けて実装するパターンです。
Builderパターンの構造
- Builderクラス インスタンスを作るためのメソッドを定義します。Builderパターンのいわば「素材」にあたります。
- Concrete Builderクラス Builderクラスを継承するサブクラスです。Builderクラスで定義したメソッドを実装します。
- Directorクラス Builderクラスを使ってインスタンスを生成します。ConcreteBuilderが何であっても機能するように、Builderクラスのメソッドのみを使います。Builderパターンのいわば「作成過程」にあたります。
- Clientクラス Builderパターンを利用するクラスです。
クライアントは、Directorに素材であるBuilderを渡し、Directorを介してオブジェクトを生成します。
Builderパターンの実装例
料理を作る機能を実装します。カレーを作ります。
Builderクラスに相当するBuilderInterfaceクラスです。料理を作る処理をするcookメソッドを定義しています。
<?php namespace DesignPatterns\Creational\Builder; interface BuilderInterface { public function cook(); }
ConcreteBuilderクラスに相当するCurryBuilderクラスです。BuilderInterfaceで定義したcookメソッドを実装しています。
<?php namespace DesignPatterns\Creational\Builder; class CurryBuilder implements BuilderInterface { public function cook() { return new Curry(); } }
Directorクラスに相当するCookingDirectorクラスです。コンストラクタでbuilderのインスタンスを受け取り、cookメソッドではbuilderのcookメソッドを呼び出しています。
<?php namespace DesignPatterns\Creational\Builder; class CookingDirector { private $builder; public function __construct(BuilderInterface $builder) { $this->builder = $builder; } public function cook() { return $this->builder->cook(); } }
Clientクラスに相当するプログラムです。
<?php $cd = new CookingDirector(new CurryBuilder()); $cd->cook();
関連パターン
- AbstractFactoryパターン
- Compositeパターン
- Facadeパターン
- TemplateMethodパターン
まとめ
Builderパターンは、Builderクラスを管理するDirectorクラスを作って、クライアントに使用させます。実際にオブジェクトを生成する過程の処理は、Directorクラスに隠蔽され、クライアントは意識せずにすみます。クライアントは作りたいBuilderクラスさえDirectorに渡せば、あとはDirectorがオブジェクトを返してくれます。
Builderパターンは、オブジェクトの生成過程が同じでも、作りたいオブジェクトが異なる場合に使えるパターンです。