0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【デザインパターン】テンプレートメソッドパターン解説(Flutter / Android 実例付き)

Posted at

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 = 流れを固定し一部を差し替え
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?