FactoryMethod パターン | デザインパターン
2022年9年23日
デザインパターン
FactoryMethod
PHP
オライリージャパンによる Head First シリーズ デザインパターン(第2版)第4章 FactoryMethod パターンを、PHPで書き直してみようという試みです。
PizzaStore.php
namespace FactoryMethod;
abstract class PizzaStore {
public function orderPizza(string $type){
$pizza = null;
$pizza = $this->createPizza($type);
$pizza->prepare();
$pizza->bake();
$pizza->cut();
$pizza->box();
return $pizza;
}
abstract public function createPizza(string $type);
}
NYPizzaStore.php
namespace FactoryMethod;
class NYPizzaStore extends PizzaStore {
public function createPizza(string $type){
$pizza = null;
if ($type === 'チーズ') {
$pizza = new NYStyleCheesePizza();
} else if($type === '野菜') {
$pizza = new NYStyleVeggiePizza();
} else if($type === 'アサリ') {
$pizza = new NYStyleClamPizza();
} else if($type === 'ペパロニ') {
$pizza = new NYStylePepperoniPizza();
}
return $pizza;
}
}
ChicagoPizzaStore.php
namespace FactoryMethod;
class ChicagoPizzaStore extends PizzaStore {
public function createPizza(string $type){
$pizza = null;
if ($type === 'チーズ') {
$pizza = new ChicagoStyleCheesePizza();
} else if($type === '野菜') {
$pizza = new ChicagoStyleVeggiePizza();
} else if($type === 'アサリ') {
$pizza = new ChicagoStyleClamPizza();
} else if($type === 'ペパロニ') {
$pizza = new ChicagoStylePepperoniPizza();
}
return $pizza;
}
}
NYStyleCheesePizza.php
namespace FactoryMethod;
class NYStyleCheesePizza extends Pizza {
public function __construct() {
$this->name = 'ニューヨークスタイルのソース&チーズピザ';
$this->dough = '薄いクラフト生地';
$this->sauce = 'マリナラソース';
$this->toppings[] = 'すりおろしたレジャーノチーズ';
}
}
ChicagoStyleCheesePizza.php
namespace FactoryMethod;
class ChicagoStyleCheesePizza extends Pizza {
public function __construct() {
$this->name = 'シカゴスタイルのディープディッシュピザ';
$this->dough = '極厚クラスト生地';
$this->sauce = 'プラムトマトソース';
$this->toppings[] = 'シュレッドモツァレラチーズ';
}
public function cut() : void {
echo 'ピザを四角形にカットする' . "\n";
}
}
Soy.php
namespace FactoryMethod;
abstract class Pizza {
public string $name;
public string $dough;
public string $sauce;
public array $toppings = [];
public function prepare() : void {
echo $this->name . 'を調理' . "\n";
echo '生地をこねる' . "\n";
echo 'ソースを追加' . "\n";
echo 'トッピングを追加:' . "\n";
foreach ($this->toppings as $topping) echo ' ' . $topping;
echo "\n";
}
public function bake() : void {
echo '180度で25分焼く' . "\n";
}
public function cut() : void {
echo 'ピザを扇型にカットする' . "\n";
}
public function box() : void {
echo 'PizzaStoreの箱にピザを入れる' . "\n";
}
public function getName() : string {
return $this->name;
}
}
index.php
use FactoryMethod\NYPizzaStore;
use FactoryMethod\ChicagoPizzaStore;
$nyStore = new NYPizzaStore();
$chicagoStore = new ChicagoPizzaStore();
$pizza = $nyStore->orderPizza('チーズ');
echo 'イーサンの注文は' . $pizza->getName() . "\n\n";
$pizza = $chicagoStore->orderPizza('チーズ');
echo 'ジョエルの注文は' . $pizza->getName() . "\n\n";
出力結果
ニューヨークスタイルのソース&チーズピザを調理
生地をこねる
ソースを追加
トッピングを追加:
すりおろしたレジャーノチーズ
180度で25分焼く
ピザを扇型にカットする
PizzaStoreの箱にピザを入れる
イーサンの注文はニューヨークスタイルのソース&チーズピザ
シカゴスタイルのディープディッシュピザを調理
生地をこねる
ソースを追加
トッピングを追加:
シュレッドモツァレラチーズ
180度で25分焼く
ピザを四角形にカットする
PizzaStoreの箱にピザを入れる
ジョエルの注文はシカゴスタイルのディープディッシュピザ