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の箱にピザを入れる ジョエルの注文はシカゴスタイルのディープディッシュピザ