🧩 Template Method パターン
✅ 設計意図
- 処理の「流れ(テンプレート)」を親クラスで定義し、差分だけサブクラスで定義
- 共通の処理は親クラスに集約される
✅ 適用理由
- 開始・終了ログなどの共通処理を一元化できる
- 「フックポイント(処理の差分)」を明示できる
✅ 向いているシーン
- 手順が決まっていて、一部だけ異なる処理を差し替えたい
- コードの重複を減らしたいとき
✅ コード例
- TypeScript
- PHP
- Python
abstract class Exporter {
export(data: string): void {
console.log("開始ログ");
this.doExport(data); // フックポイント(抽象メソッド)
console.log("完了ログ");
}
protected abstract doExport(data: string): void;
}
class PdfExporter extends Exporter {
protected doExport(data: string): void {
console.log(`PDF出力: ${data}`);
}
}
class CsvExporter extends Exporter {
protected doExport(data: string): void {
console.log(`CSV出力: ${data}`);
}
}
class XmlExporter extends Exporter {
protected doExport(data: string): void {
console.log(`XML出力: ${data}`);
}
}
// 利用例
const exporter = new CsvExporter();
exporter.export("データ123");
<?php
abstract class Exporter {
public function export(string $data): void {
echo "開始ログ\n";
$this->doExport($data); // フックメソッド(差分のみサブクラスに委譲)
echo "完了ログ\n";
}
abstract protected function doExport(string $data): void;
}
class PdfExporter extends Exporter {
protected function doExport(string $data): void {
echo "PDF出力: {$data}\n";
}
}
class CsvExporter extends Exporter {
protected function doExport(string $data): void {
echo "CSV出力: {$data}\n";
}
}
class XmlExporter extends Exporter {
protected function doExport(string $data): void {
echo "XML出力: {$data}\n";
}
}
// 利用例
$exporter = new XmlExporter();
$exporter->export("データ123");
from abc import ABC, abstractmethod
class Exporter(ABC):
def export(self, data: str):
print("開始ログ")
self.do_export(data) # フックメソッド
print("完了ログ")
@abstractmethod
def do_export(self, data: str):
pass
class PdfExporter(Exporter):
def do_export(self, data: str):
print(f"PDF出力: {data}")
class CsvExporter(Exporter):
def do_export(self, data: str):
print(f"CSV出力: {data}")
class XmlExporter(Exporter):
def do_export(self, data: str):
print(f"XML出力: {data}")
# 利用例
exporter = PdfExporter()
exporter.export("データ123")
✅ 解説
このコードは Template Method
パターン を使用して、共通の処理フローを抽象クラスで定義し、具体的な処理部分をサブクラスに委譲する設計を実現している。
Template Method
パターンは、アルゴリズムの骨組みをスーパークラスで定義し、詳細な処理をサブクラスで実装するデザインパターン。
1. Template Method パターンの概要
- AbstractClass: アルゴリズムの骨組みを定義し、具体的な処理をサブクラスに委譲する抽象クラス
- このコードでは
Exporter
が該当
- このコードでは
- ConcreteClass:
AbstractClass
を継承し、抽象メソッドを実装して具体的な処理を提供するクラス- このコードでは
PdfExporter
,CsvExporter
,XmlExporter
が該当
- このコードでは
2. 主なクラスとその役割
Exporter
- 抽象クラス(
AbstractClass
) export
メソッドで共通の処理フローを定義- 「開始ログ」を出力
doExport
メソッド(抽象メソッド)を呼び出して具体的な処理を実行- 「完了ログ」を出力
doExport
メソッドをサブクラスに委譲
- 抽象クラス(
PdfExporter
,CsvExporter
,XmlExporter
- 具体クラス(
ConcreteClass
) doExport
メソッドを実装し、それぞれ異なる形式(PDF, CSV, XML)でデータを出力
- 具体クラス(
3. UML クラス図
4. Template Method パターンの利点
- コードの再利用: 共通の処理フローをスーパークラスにまとめることで、コードの重複を削減
- 拡張性: 新しい具体クラスを追加する場合も、抽象メソッドを実装するだけで対応可能
- 一貫性: 共通の処理フローをスーパークラスで定義することで、処理の一貫性を確保
この設計は、共通の処理フローを持つが、一部の処理が異なる場合に非常に有効であり、コードの保守性と拡張性を向上させる。