cheka.jp 超不定期で更新する写真達。お口直しにどうぞ。

[写経] PHPで学ぶデザインパターン09

— 注意 —
PHPによるデザインパターンの写経ですが、まんま書くと問題があるのでアウトプットとして備忘録メモです

初心者には分かりやすくて良い本なので、是非本屋でチェックして下さい。

URL: http://www.amazon.co.jp/PHPによるデザインパターン入門-下岡-秀幸/dp/4798015164
PHPによるデザインパターン入門

Builderで生成の手順と手段を分離する

生成 + オブジェクト

このパターンも移譲を使ったデザインパターンです。
データ構造を受け取るクラスがデータ生成を担当するクラスへ処理を移譲している部分に注目して下さい。

まずはいつものBookクラス

少しだけシンプルにしました。

/*
貸し出される本クラス
*/
class Book {
	//本のID
	private $id;
	//本の名前
	private $title;
	//コンストラクタ
	public function __construct($id,$title) {
		$this->id = $id;
		$this->title = $title;
	}
	//ID取得
	public function getId() {
		return $this->id;
	}
	//名称取得
	public function getTitle() {
		return $this->title;
	}
}

データ生成を担当するクラス

クライアントへ利用させるインターフェイスを定義しクラスの差し替えが簡単に出来るようにしましょう。

/*
本を生成するBuilderインターフェイス
*/
interface BookBuilderInterFace {
	//解析するメソッド
	public function parse($data);
}

インターフェイスを実装したクラスです。
CSVとTSVから本の情報を生成するように実装します。

/*
CSVから本の情報を生成するBuilderクラス
*/
class BookBuildFromCsv implements BookBuilderInterFace{
	//CSVから本を生成する
	public function parse($data){
		$explode = explode(",",$data);
		return new Book($explode[0],$explode[1]);
	}
}

 

/*
TSVから本の情報を生成するBuilderクラス
*/
class BookBuildFromTsv implements BookBuilderInterFace{
	//CSVから本を生成する
	public function parse($data){
		$explode = explode("\t",$data);
		return new Book($explode[0],$explode[1]);
	}
}

受付を担当するクラス

データを受け付けて生成クラスへ処理を移譲するクラスです。
クライアントとやりとりを行います。

/*
本の生成を担当するクラス
*/
class BookCreator {

	private $builder;

	//コンストラクタ
	public function __construct(BookBuilderInterFace $builder) {
		$this->builder = $builder;
	}

	//本の生成
	public function createBook($data) {
		return $this->builder->parse($data);
	}
}

使ってみる

まずはCSV形式を試してみましょう。

$creator = new BookCreator(new BookBuildFromCsv());
$book = $creator->createBook("1,よく分かるデザインパターン!");
print sprintf("ID:%02d,TITLE:%s\n",$book->getId(),$book->getTitle());

 

$php builder.php

 

ID:01,TITLE:よく分かるデザインパターン!

次はTSV形式を試してみましょう。

$creator = new BookCreator(new BookBuildFromTsv());
$book = $creator->createBook("1\tよく分かるデザインパターン!TSV");
print sprintf("ID:%02d,TITLE:%s\n",$book->getId(),$book->getTitle());

 

$php builder.php

 

ID:01,TITLE:よく分かるデザインパターン!TSV

bulderを選択するデザインパターンと組み合わせるとメンテナンスが楽になりそうですね!