🔖
デザインパターンを学ぶ #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