単純ファクトリーパターン

 以下のサンプルは単純ファクトリーパターンの実装例です。
ファクトリークラスは`createDrink`メソッドにより`Drink`インターフェイスを実装したクラスを作成します。
選択的に異なる飲料を簡単に生成できるようになってます。

 また、ファクトリーパターンはストラテジーパターンと非常に相性が良いです。
組み合わせて使用することでコードの保守性と拡張性が向上します。

<?php

/**
 * 飲料インターフェイス
 */
interface Drink
{
    public function getName(): string;
}
                    
<?php

/**
 * 飲料タイプ
 */
enum DrinkType
{
    case COLA;
    case ORANGE_JUICE;
}
                    
<?php

/**
 * コーラクラス
 */
class Cola implements Drink
{
    public function getName(): string
    {
        return 'コーラ';
    }
}
                    
<?php

/**
 * オレンジジュースクラス
 */
class OrangeJuice implements Drink
{
    public function getName(): string
    {
        return 'オレンジジュース';
    }
}
                    
<?php

/**
 * 飲料ファクトリー
 */
class DrinkFactory
{
    public static function createDrink(DrinkType $drinkType): Drink
    {
        return match ($drinkType) {
            DrinkType::COLA => new Cola(),
            DrinkType::ORANGE_JUICE => new OrangeJuice(),
        };
    }
}
                    
<?php

$cola = DrinkFactory::createDrink(DrinkType::COLA);
echo $cola->getName(); // 出力: コーラ
$orangeJuice = DrinkFactory::createDrink(DrinkType::ORANGE_JUICE);
echo $orangeJuice->getName(); // 出力: オレンジジュース