1. パターンの意図
テンプレートメソッド(Template Method)パターン は、
処理の手順(アルゴリズム)の骨組みをスーパークラスに定義し、一部の処理をサブクラスに任せる デザインパターンです。
解決する問題
- アルゴリズムの「流れ」は共通だが、部分的な処理だけクラスごとに異なる
- 同じような処理の重複を減らしたい
- 共通部分は上位クラスで定義し、違う部分はサブクラスに実装させたい
ポイント
- Template Method:処理の手順を定義(finalにして変えさせない)
- 抽象メソッド / フックメソッド:サブクラスに実装を任せる部分
- 共通処理は再利用し、差分部分だけをカスタマイズ
2. UML 図
3. Flutter / Dart 実装例
抽象クラス
abstract class DataParser {
void parseData() {
readData();
processData();
saveData();
}
void readData(); // サブクラス任せ
void processData(); // サブクラス任せ
void saveData() {
print("Saving data to DB");
}
}
具体クラス
class CsvParser extends DataParser {
@override
void readData() => print("Reading CSV file");
@override
void processData() => print("Processing CSV data");
}
class JsonParser extends DataParser {
@override
void readData() => print("Reading JSON file");
@override
void processData() => print("Processing JSON data");
}
利用例
void main() {
DataParser parser = CsvParser();
parser.parseData();
parser = JsonParser();
parser.parseData();
}
出力:
Reading CSV file
Processing CSV data
Saving data to DB
Reading JSON file
Processing JSON data
Saving data to DB
4. Android / Kotlin 実装例
抽象クラス
abstract class DataParser {
fun parseData() {
readData()
processData()
saveData()
}
abstract fun readData()
abstract fun processData()
open fun saveData() {
println("Saving data to DB")
}
}
具体クラス
class CsvParser : DataParser() {
override fun readData() = println("Reading CSV file")
override fun processData() = println("Processing CSV data")
}
class JsonParser : DataParser() {
override fun readData() = println("Reading JSON file")
override fun processData() = println("Processing JSON data")
}
利用例
fun main() {
var parser: DataParser = CsvParser()
parser.parseData()
parser = JsonParser()
parser.parseData()
}
5. 実務ユースケース
Flutter
- API レスポンス処理の共通フロー(取得 → パース → 保存)
- Widget レンダリングの流れを統一し、カスタム部分を差し替え
- データ変換処理の雛形クラス
Android / Kotlin
- Activity / Fragment のライフサイクル管理(共通フックメソッド)
- DB 操作の雛形(接続 → 操作 → クローズ)
- ファイルの入出力パターン
6. メリット / デメリット
メリット
- アルゴリズムの流れを一元化できる
- 共通処理とカスタム処理を分離できる
- 新しいサブクラスを追加すれば柔軟に拡張可能
デメリット
- 継承ベースのため柔軟性が下がる場合もある
- サブクラスが増えすぎると複雑になる
まとめ
- テンプレートメソッドパターンは「流れを決めて差分だけサブクラスに任せる」設計
- Flutter/Android では データ処理やライフサイクル管理に便利
- Strategy = 並列にアルゴリズム切替、Template Method = 流れを固定し一部を差し替え