【デザインパターン】シンプルな設計を実現!Template Methodパターンの基本と実践

Template Methodパターンは、アルゴリズムの共通部分を抽象クラスに定義し、具体的な処理をサブクラスに委ねるデザインパターンです。このパターンを使うと、コードの重複を減らし、拡張しやすい設計が可能になります。

本記事ではC#のサンプルコードを用いて、Template Methodパターンの仕組みと実践方法を解説します。他のオブジェクト指向言語(Java、Pythonなど)でも応用できるため、ぜひ参考にしてください。

目次

受講者数No.1!初心者からプロへ導く信頼のスクール

    短期間で習得可能!未経験から実践力を磨く充実のプログラム

    今なら無料相談でAmazonギフトカードがもらえる!

    Template Methodパターンとは?

    Template Methodパターンは、スーパークラス(親クラス)に処理のテンプレートを定義し、一部の処理をサブクラス(子クラス)で実装するデザインパターンです。

    例えば、データの読み取りと出力処理を考えてみましょう。全体の流れは共通でも、データの取得方法が異なる場合があります。このようなケースでは、共通の処理を親クラスにまとめ、可変部分だけをサブクラスで実装するのがTemplate Methodパターンの役割です。

    Template Methodパターンのメリット

    このパターンを使うと、次のようなメリットがあります。

    • コードの重複を削減:共通部分を抽象クラスにまとめるため、重複した処理を書かずに済む。
    • 保守性が向上:修正が必要な場合、親クラスの変更だけで済むため、影響範囲を最小限に抑えられる。
    • 拡張しやすい:新しい具体的な処理を追加する場合、サブクラスを作成するだけで対応できる。

    実装方法(C#サンプルコード)

    それでは、C#を使ってTemplate Methodパターンを実装してみましょう。

    (1) 抽象クラスを定義する

    abstract class DataProcessor
    {
        // テンプレートメソッド(処理の流れを定義)
        public void Process()
        {
            ReadData();
            ProcessData();
            SaveData();
        }
    
        // 具象クラスで実装する部分
        protected abstract void ReadData();
        protected abstract void ProcessData();
    
        // 共通処理(変更不要)
        private void SaveData()
        {
            Console.WriteLine("データを保存しました。");
        }
    }
    

    (2) 具体的な処理をサブクラスで実装する

    class CsvDataProcessor : DataProcessor
    {
        protected override void ReadData()
        {
            Console.WriteLine("CSVファイルからデータを読み込みました。");
        }
    
        protected override void ProcessData()
        {
            Console.WriteLine("CSVデータを処理しました。");
        }
    }
    
    class ApiDataProcessor : DataProcessor
    {
        protected override void ReadData()
        {
            Console.WriteLine("APIからデータを取得しました。");
        }
    
        protected override void ProcessData()
        {
            Console.WriteLine("APIデータを処理しました。");
        }
    }
    

    (3) 実際に動作させる

    class Program
    {
        static void Main()
        {
            DataProcessor csvProcessor = new CsvDataProcessor();
            csvProcessor.Process();
    
            Console.WriteLine();
    
            DataProcessor apiProcessor = new ApiDataProcessor();
            apiProcessor.Process();
        }
    }
    
    CSVファイルからデータを読み込みました。
    CSVデータを処理しました。
    データを保存しました。
    
    APIからデータを取得しました。
    APIデータを処理しました。
    データを保存しました。
    

    このように、共通の処理の流れ(Processメソッド)は抽象クラスにあり、データの取得・処理部分のみをサブクラスで実装しています。

    4. 応用例と注意点

    (1) 応用例

    Template Methodパターンは、次のような場面で活用できます。

    • ファイルフォーマットごとの処理(CSV, XML, JSON など)
    • データベースとAPIのデータ処理の統一
    • レポートの生成処理(Excel, PDF など)

    (2) 注意点

    • 抽象クラスを変更すると影響範囲が広がるため、慎重に設計する必要がある。
    • サブクラスが増えすぎると管理が複雑になるため、適切に構造を設計することが重要。

    まとめ

    • Template Methodパターンは、アルゴリズムの流れを親クラスに定義し、一部の処理をサブクラスで実装するパターン。
    • コードの重複を減らし、保守性と拡張性を向上させる。
    • C#の抽象クラスと継承を利用して簡単に実装できる。
    • データ処理やレポート生成など、さまざまな場面で応用可能。

    Template Methodパターンは、シンプルなコードで共通の処理をまとめつつ、柔軟にカスタマイズできる便利なデザインパターンです。

    特に、大規模なプロジェクトで同じような処理が繰り返し発生する場合に大いに役立ちます。ぜひ、実際の開発で活用してみてください!

    よかったらシェアしてね!
    • URLをコピーしました!
    • URLをコピーしました!
    目次