はじめに
デザインパターンのTemplateMethodパターンとFactoryMethodパターンはどちらも「スーパークラスで処理の枠組みを定義し、サブクラスで具体的な処理を実装する」のような共通点がありますが、目的は明確に異なります。私は、学習中、共通点と目的がごっちゃになって混乱してしまいました。そのため今回これらのパターンを整理するために記事としてまとめることにしました。
TemplateMethodパターン
TemplateMethodパターンは、処理の大枠を定義しつつ、具体的な処理の一部をサブクラスにゆだねるデザインパターンです。共通の流れを変更せず、部分的な変更のみを可能とすることでコードの再利用性を高め、一貫性のある処理フローを確立することができます。
とあるアプリの保存処理に以下のようなプロセスが存在するとします。
- 保存開始のダイアログを表示する
- 保存するデータの処理を行う
- データを保存する
- 保存完了のダイアログを表示する
このとき1から4をそれぞれ抽象メソッドとして作成します。そして1から4のプロセスをまとめたものは公開メソッドとして作成しておきます。このようにすることで、保存処理の共通の流れを変更せず、部分的な変更のみが可能となります。
FactoryMethodパターン
FactoryMethodパターンは、オブジェクトの生成をサブクラスに委ねるデザインパターンです。これにより、具象クラスのインスタンス化をカプセル化し、拡張性の高い設計を実現できます。
以下はゲームの役職ごとにIDを生成し、行動を設定するためにFactoryMethodパターンを用いたクラス図です。
このように設計しておくことで、新たに占い師のロールIDを作りたいときにはSeerIdFactoryクラスとSeerIDクラスを作成するだけで既存の設計を変更することなく拡張できます。
まとめ
TemplateMethodパターン
- 処理の流れを共通化することが目的
- 抽象クラスで処理の流れを定義し、部分的な実装をサブクラスにゆだねる
- 処理の流れを統一したいとき
- 処理の流れは変更せず、部分的なカスタマイズが可能
FactoryMethodパターン
- オブジェクトの生成を統一することが目的
- 生成メソッドを抽象メソッドとして定義し、サブクラスが具象クラスを決定
- 具象クラスのインスタンス化をカプセル化したいとき
- 生成するオブジェクトの種類が増減しても全体への影響は少ない
おわりに
今回は、デザインパターンの中からTemplateMethodパターンとFactoryMethodパターンの説明をしました。それぞれのパターンの目的をしっかりと理解して使い分けていきたいと思います。