読者です 読者をやめる 読者になる 読者になる

darudaru

だるだるしてるエンジニア

PHPでデザインパターン「Builderパターン」

GoFデザインパターンPHPでプログラムを書いてみながら勉強していきます。「増補改訂版 Java言語で学ぶデザインパターン入門」を参考にさせて頂いています。プログラムはGithubにあげていきます。

Builderパターンとは

builderとは、日本語で建築者、建造者という意味です。例えば家を建てる時のことを考えてみます。最終的に完成する家は、何を使って作成するかという「素材」と、どのように家を建てるかという「作成過程」によって、違ってきます。 Builderパターンとは、「素材」と「作成過程」を分けて実装するパターンです。

Builderパターンの構造

builder_m

  • Builderクラス インスタンスを作るためのメソッドを定義します。Builderパターンのいわば「素材」にあたります。
  • Concrete Builderクラス Builderクラスを継承するサブクラスです。Builderクラスで定義したメソッドを実装します。
  • Directorクラス Builderクラスを使ってインスタンスを生成します。ConcreteBuilderが何であっても機能するように、Builderクラスのメソッドのみを使います。Builderパターンのいわば「作成過程」にあたります。
  • Clientクラス Builderパターンを利用するクラスです。

クライアントは、Directorに素材であるBuilderを渡し、Directorを介してオブジェクトを生成します。

Builderパターンの実装例

料理を作る機能を実装します。カレーを作ります。

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();

関連パターン

まとめ

Builderパターンは、Builderクラスを管理するDirectorクラスを作って、クライアントに使用させます。実際にオブジェクトを生成する過程の処理は、Directorクラスに隠蔽され、クライアントは意識せずにすみます。クライアントは作りたいBuilderクラスさえDirectorに渡せば、あとはDirectorがオブジェクトを返してくれます。

Builderパターンは、オブジェクトの生成過程が同じでも、作りたいオブジェクトが異なる場合に使えるパターンです。

デザインパターン