🧩 Factory Method パターン
✅ 設計意図
- 「どのクラスを生成するか」をサブクラスに任せる
- 生成の責務を集約し、処理の柔軟性と拡張性を高める
✅ 適用理由
- Logger のようなユーティリティを共通の工場メソッドで管理
- 実装の切り替えやモック導入が容易になる
✅ 向いているシーン
- バージョン別や条件に応じて生成クラスを切り替えたいとき
- フレームワークレベルで拡張性を意識した設計をしたいとき
✅ コード例
- TypeScript
- PHP
- Python
class Logger {
log(message: string) {
console.log(`[LOG]: ${message}`);
}
}
// Creator(抽象クラス)
abstract class UserService {
protected logger: Logger;
constructor() {
this.logger = this.createLogger(); // Factory Method を呼ぶ
}
protected abstract createLogger(): Logger;
createUser(name: string) {
this.logger.log(`ユーザー作成: ${name}`);
}
}
// ConcreteCreator
class DefaultUserService extends UserService {
protected createLogger(): Logger {
return new Logger();
}
}
// 利用例
const service = new DefaultUserService();
service.createUser("Hiroshi");
<?php
class Logger {
public function log(string $message): void {
echo "[LOG]: {$message}\n";
}
}
// Creator(抽象クラス)
abstract class UserService {
protected Logger $logger;
public function __construct() {
$this->logger = $this->createLogger();
}
abstract protected function createLogger(): Logger;
public function createUser(string $name): void {
$this->logger->log("ユーザー作成: {$name}");
}
}
// ConcreteCreator
class DefaultUserService extends UserService {
protected function createLogger(): Logger {
return new Logger();
}
}
// 利用例
$service = new DefaultUserService();
$service->createUser("Hiroshi");
from abc import ABC, abstractmethod
class Logger:
def log(self, message: str):
print(f"[LOG]: {message}")
# Creator(抽象クラス)
class UserService(ABC):
def __init__(self):
self.logger = self.create_logger()
@abstractmethod
def create_logger(self) -> Logger:
pass
def create_user(self, name: str):
self.logger.log(f"ユーザー作成: {name}")
# ConcreteCreator
class DefaultUserService(UserService):
def create_logger(self) -> Logger:
return Logger()
# 利用例
service = DefaultUserService()
service.create_user("Hiroshi")
✅ 解説
このコードは Factory Method
パターン を使用して、オブジェクト生成の責務をサブクラスに委譲する設計を実現している。
Factory Method
パターンは、インスタンス生成の詳細を隠蔽し、生成プロセスをサブクラスでカスタマイズ可能にするデザインパターン。
1. Factory Method パターンの概要
- Creator: オブジェクト生成のための抽象メソッド(
Factory Method
)を定義するクラス- このコードでは
UserService
が該当
- このコードでは
- ConcreteCreator:
Factory Method
を実装し、具体的なオブジェクト生成ロジックを提供するクラス- このコードでは
DefaultUserService
が該当
- このコードでは
- Product:
Factory Method
によって生成されるオブジェクト- このコードでは
Logger
が該当
- このコードでは
2. 主なクラスとその役割
Logger
Factory Method
によって生成される具体的なオブジェクト(Product
)- ログ出力の機能を提供
UserService
Creator
クラスcreateLogger
という抽象メソッド(Factory Method
)を定義し、サブクラスに生成ロジックを委譲createUser
メソッドでユーザー作成時にLogger
を使用
DefaultUserService
ConcreteCreator
クラスcreateLogger
メソッドを実装し、具体的なLogger
インスタンスを生成
3. UML クラス図
4. Factory Method パターンの利点
- 生成プロセスのカスタマイズ: サブクラスで
Factory Method
をオーバーライドすることで、生成されるオブジェクトを柔軟に変更可能。 - 疎結合:
Creator
クラスは具体的なProduct
クラスに依存せず、拡張性が高い。 - 再利用性:
Factory Method
を使用することで、生成ロジックを統一し、コードの再利用性を向上。
この設計は、オブジェクト生成の責務を分離し、生成プロセスを柔軟にカスタマイズ可能にする。 特に、生成されるオブジェクトが変更される可能性がある場合や、生成ロジックが複雑な場合に有効に機能する。