【ITニュース解説】The Template Method Design Pattern...
2025年09月05日に「Dev.to」が公開したITニュース「The Template Method Design Pattern...」について初心者にもわかりやすいように丁寧に解説しています。
ITニュース概要
テンプレートメソッドは、処理の大枠を親クラスで定め、具体的な処理を子クラスに任せるデザインパターン。共通処理は親クラスに、個別の処理は子クラスに記述することで、アルゴリズムの骨格を再利用しつつ、部分的な変更を容易にする。
ITニュース解説
ソフトウェア開発の世界には、先人たちが築き上げてきた設計の知恵、いわゆる「デザインパターン」が存在する。これは、特定の問題に対して効果的で再利用可能な設計の「型」や「定石」を示すものであり、その一つに「テンプレートメソッドパターン」がある。このパターンは、一連の処理の流れ(アルゴリズム)の骨格をあらかじめ決めておき、その中の一部の具体的な処理内容だけを後から差し替えられるようにする設計手法である。
テンプレートメソッドパターンは、主に二種類のクラスによって構成される。一つは「抽象クラス(AbstractClass)」、もう一つは「具象クラス(ConcreteClass)」である。抽象クラスは、全体の処理手順を定義した「テンプレートメソッド」と、全ての具象クラスで共通となる処理を実装したメソッドを持つ。そして最も重要な点として、具象クラスごとに内容が異なる処理部分を「抽象メソッド」として定義する。抽象メソッドとは、メソッドの名前や引数の型といった仕様だけが決められており、具体的な処理内容は空になっているものである。この抽象クラスは設計図のような役割を担い、これ自体を直接使うことはできない。
一方、具象クラスは、この抽象クラスを継承して作られる。継承とは、親クラスの機能を引き継ぐことであり、具象クラスは抽象クラスで定義された共通処理やテンプレートメソッドをそのまま利用できる。その上で、具象クラスは自身の役割に応じて、親クラスで未定義だった抽象メソッドの具体的な処理内容を実装(オーバーライド)する。これにより、アルゴリズム全体の骨格は親である抽象クラスによって統一されつつも、個々の詳細な処理は子である具象クラスがそれぞれ担当するという、役割分担が実現される。
提示された記事の例を用いると、この構造はより明確に理解できる。ここでは、工学部生の1日の活動をモデル化している。まず、「EngineeringStudent」という抽象クラスが定義される。このクラスは、学生の1日の活動の流れを示す「activityofAStudent」というテンプレートメソッドを持っている。このメソッドは、「signIn(登校時に記帳)」「attendClass(授業に出席)」「signOut(下校時に記帳)」という三つの処理を順番に呼び出すという骨格を定義している。
このうち、「signIn」と「signOut」は、どの専攻の学生であっても共通の行動であるため、具体的な処理内容が「EngineeringStudent」クラス内に直接記述されている。しかし、「attendClass」は、電子工学の学生とコンピュータ科学の学生とでは出席する授業が異なる。そのため、「EngineeringStudent」クラスでは「attendClass」を具体的な処理内容のない抽象メソッドとして定義し、その実装を継承先の子クラスに委ねている。
次に、この「EngineeringStudent」クラスを継承した具象クラスとして、「ElectronicsStudent(電子工学の学生)」と「ComputerScienceStudent(コンピュータ科学の学生)」が登場する。これらのクラスは、それぞれが親クラスから引き継いだ抽象メソッド「attendClass」に対して、自身の専攻に合わせた具体的な処理を実装する。「ElectronicsStudent」は「電子工学部の授業に出席する」という処理を、「ComputerScienceStudent」は「コンピュータ科学部の授業に出席する」という処理を記述する。
実際にプログラムを実行する際には、「ElectronicsStudent」や「ComputerScienceStudent」のインスタンスを生成し、親クラスから継承したテンプレートメソッド「activityofAStudent」を呼び出す。すると、まず親クラスに実装されている共通処理「signIn」が実行され、次いで、それぞれの具象クラスが独自に実装した「attendClass」が実行される。最後に、再び親クラスの共通処理「signOut」が実行される。この結果、処理の全体の流れは同じでありながら、中間の「授業に出席する」という部分だけが、オブジェクトの種類に応じて動的に切り替わることになる。
テンプレートメソッドパターンを利用する主な利点は、コードの再利用性を高め、プログラムの保守性を向上させる点にある。共通の処理を抽象クラスに一元化することで、同じコードを複数のクラスに記述する必要がなくなり、コードの重複を防ぐことができる。また、アルゴリズムの骨格が抽象クラスで固定されているため、具象クラスを実装する開発者は、処理の順番を間違えたり、必要な処理を忘れたりするリスクを低減できる。将来的に新しい専攻の学生(例えば機械工学の学生)を追加する場合も、「EngineeringStudent」を継承して新しい具象クラスを作成し、「attendClass」メソッドを実装するだけで済むため、既存のコードに影響を与えることなく機能を拡張できる。このように、テンプレートメソッドパターンは、処理の大枠を統一しつつ、細部の振る舞いを柔軟に変更したい場合に非常に有効な設計手法である。