PHP デザインパターン(Factory Methodパターン)

Factory Methodパターン

↓買ったので、JavaPHPに読み替えて勉強。そのメモ。

鍵を作る工場

ProductとFactoryはフレームワーク
KeyとKeyFactoryはフレームワークに肉付けしたもの。

<?php

abstract class Product{
	public abstract function makeUse();
}

abstract class Factory{
	final function create($owner){
		$product = $this->createProduct($owner);
		
		$this->registerProduct($product);
		
		return $product;
	}

        //継承したクラスに、createProductでnewによるインスタンス生成を任せるのがポイント
	protected abstract function createProduct($owner);

	protected abstract function registerProduct($product);
}



class Key extends Product{
	private $owner;
	
	function __construct($owner){
		$this->owner = $owner;
	}
	
	public function makeUse(){
		echo $this->owner."の鍵を使うよ。";
	}
	public function getOwner(){
		return $owner;
	}
}

class KeyFactory extends Factory{
	private $owners = array();

	protected function createProduct($owner){
		return new Key($owner);
	}
	
	protected function registerProduct($product){
		$owners[] = $product->getOwner();
	}
	
	public function getOwners(){
		return $owners;
	}
}

$factory = new KeyFactory();

$key1    = $factory->create("田中さん");
$key2    = $factory->create("村田さん");

$key1->makeUse();
$key2->makeUse();

?>

Factory Methodパターンを使うとうれしいこと

フレームワーク(ProductとFactory)を修正せずに、別の製品と工場を作れる。