nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

Template Method パターン [C#]

TemplateMethodパターンとは

Template Method パターンの目的は、ある処理のおおまかなアルゴリズムをあらかじめ決めておいて、
そのアルゴリズムの具体的な設計をサブクラスに任せることである。そのため、システムのフレームワークを構築するための手段としてよく活用される。

抽象メソッドとは、実装を持たず、メソッドの意味(規約)だけを定義したメソッドです。 抽象メソッドの実装は基底クラスでは行わず、派生クラスで行います。
また、抽象クラスとは、 インスタンスを生成出来ないクラスのことで、 継承して使うことを前提としたクラスのことです。

サンプル例

小型トラック(2tトラック)と大型トラック(10tトラック)を作ろうとしたとき、特定の順序ですべて作成してほしい場合に役立ちます。 サンプルコードでは、以下の順序でトラックを作成します。

(1) パーツを購入する (2) パーツを加工する (3) 組み立てる (4) 塗装する

クラス図

抽象クラスは、TemplateMethodMakeCarクラスです。サブクラス(BigTrackクラス、SmallTrackクラス)に具体的な設計を任せます。

f:id:nprogram:20181108064902p:plain

コード

using System;

namespace TemplateMethodOriginal
{
    class Program
    {
        static void Main(string[] args)
        {
            BigTrack BigTrack = new BigTrack();
            BigTrack.createMakeCar();

            SmallTrack SmallTrack = new SmallTrack();
            SmallTrack.createMakeCar();


            // 実行が一瞬で終わって確認できないので、キーの入力を待ちます
            Console.ReadLine();
        }
    }
    public abstract class TemplateMethodMakeCar
    {
        protected abstract void BuyParts();
        protected abstract void MakeParts();
        protected abstract void Assemble();
        protected abstract void PaintBody();

        public void createMakeCar()
        {
            BuyParts();
            MakeParts();
            Assemble();
            PaintBody();
        }
    }

    public class BigTrack : TemplateMethodMakeCar
    {
        override protected void BuyParts()
        {
            Console.WriteLine("大型トラックの部品を購入する");
        }

        override protected void MakeParts()
        {
            Console.WriteLine("大型トラックの部品を加工する");
        }
        override protected void Assemble()
        {
            Console.WriteLine("大型トラックの組み立てる");
        }
        override protected void PaintBody()
        {
            Console.WriteLine("大型トラックの塗装する");
        }
    }

    public class SmallTrack : TemplateMethodMakeCar
    {
        override protected void BuyParts()
        {
            Console.WriteLine("小型トラックの部品を購入する");
        }

        override protected void MakeParts()
        {
            Console.WriteLine("小型トラックの部品を加工する");
        }
        override protected void Assemble()
        {
            Console.WriteLine("小型トラックの組み立てる");
        }
        override protected void PaintBody()
        {
            Console.WriteLine("小型トラックの塗装する");
        }
    }
}

f:id:nprogram:20181028162858p:plain