🔖

デザインパターンを学ぶ #2 Factory Method(ファクトリメソッド)

に公開

1. はじめに

デザインパターン学習シリーズの第2回。今日は「Factory Method(ファクトリメソッド)」を取り上げます。
目的は「インスタンス生成を利用側から切り離して、柔軟に管理する方法」を理解することです。

2. Factory Method とは?

インスタンス生成の責務をクラスやメソッドに委譲するパターンです。
利用側は new を直接書かずに、ファクトリを経由してインスタンスを取得します。
「どの具象クラスを作るか」を意識せずに済むのがポイントです。

3. 実装例(PHP)

interface Payment {
    public function pay(int $amount): void;
}

class CreditCardPayment implements Payment {
    public function pay(int $amount): void {
        echo "Paid {$amount} by Credit Card\n";
    }
}

class PaypalPayment implements Payment {
    public function pay(int $amount): void {
        echo "Paid {$amount} by PayPal\n";
    }
}

class PaymentFactory {
    public static function create(string $type): Payment {
        return match ($type) {
            'credit' => new CreditCardPayment(),
            'paypal' => new PaypalPayment(),
            default  => throw new InvalidArgumentException("Unknown payment type"),
        };
    }
}

// 利用側
$payment = PaymentFactory::create('paypal');
$payment->pay(1000); // Paid 1000 by PayPal

4. メリットと注意点

メリット

  • インスタンス生成の責務を一か所にまとめられる
  • 利用側が具体的なクラスに依存しない

注意点

  • クラス数が増えやすい
  • 単純なケースに使うと逆に冗長になる

5. 実務での利用例

  • Laravel の Cache::store()DB::connection() は内部でファクトリを使ってインスタンスを生成している
  • 支払い方法、ストレージドライバ、通知チャネルなど「条件で実体を切り替える」場面でよく使われる

6. まとめ

Factory Method は「new の代わりに生成処理をまとめたメソッドを呼ぶ」仕組みです。
拡張性や保守性を高めるのに役立ちます。
次回は Strategy など振る舞い系のパターンを紹介すると流れが自然です。

Discussion