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

 以下のサンプルはファクトリーメソッドパターンの実装例です。
ファクトリーメソッドパターンは、ファクトリークラスを抽象化し、各飲料クラス専用の生成機能として使用します。
このアプローチにより、凝集度を高め、新しい飲料の追加や変更が容易になります。

 しかし、単純ファクトリーパターンにある一つのファクトリーから選択的にオブジェクトを生成する機能は失われました。
この点は、システム要件に応じて検討すべき重要な要因です。
ファクトリーパターンの選択に際して、各パターンの特徴と利点をよく理解し、設計ニーズに合致するものを選択する必要があります。

<?php

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

/**
 * 飲料ファクトリークラス
 */
abstract class DrinkFactory
{
    abstract public function createDrink(): Drink;
}
                    
<?php

/**
 * コーラファクトリークラス
 */
class ColaFactory extends DrinkFactory
{
    public function createDrink(): Drink
    {
        return new Cola();
    }
}
                    
<?php

/**
 * オレンジジュースファクトリークラス
 */
class OrangeJuiceFactory extends DrinkFactory
{
    public function createDrink(): Drink
    {
        return new OrangeJuice();
    }
}
                    
<?php

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

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

$colaFactory = new ColaFactory();
$cola = $colaFactory->createDrink();
echo $cola->getName(); // 出力: コーラ

$orangeJuiceFactory = new OrangeJuiceFactory();
$orangeJuice = $orangeJuiceFactory->createDrink();
echo $orangeJuice->getName(); // 出力: オレンジジュース