ファクトリーメソッド パターン

FactoryMethod Pattern

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

だてめがね
...
©️ ponpocopy

とある企業で社内SEをしています。 自身の学びが誰かの為になれば、という想いで日々ブログを更新中。 PHP(CakePHP・Laravel・FuelPHP), Pyhotn(Django・Flask), C#(ASP.NET、Unity) が好きです。