アレがアレでアレ

(できれば)プログラミング関係のことを書きたい

Template Method パターン

ライブラリとかフレームワークの使い方をアウトプットするのもいいけど、
もっと基礎力がつきそうなことのほうがいいのでは?と思ったのでデザインパターンとやらをお勉強してみることにしました。

というわけで、まずはTemplate Methodパターン

Template Methodって

おおまかな処理の枠組みをスーパークラスに置いて、具体的な処理をサブクラスで実装するデザインパターン
簡単に言うと、大筋の処理はだいたい同じだけど部分的に違う箇所をサブクラスで実装することで似たような処理を共通化できますよ〜というものらしいです。

「ピザを作る」という処理を共通化し、色々な種類のピザを作れるようにします。
「作る」工程を抽象クラスであるPizzaクラスに置いて、
Pizzaクラスを継承した具象クラスに使うソースやトッピングを実装していきます。

プログラムはC#で書きました。

抽象クラス

abstract class Pizza
{
    public void Make()
    {
        Start();
        RollOut();
        Spread();
        Topping();
        Bake();
        End();
    }

    protected abstract void Start();

    protected void RollOut()
    {
        Console.WriteLine("生地を伸ばす");
    }

    protected abstract void Spread();
    protected abstract void Topping();

    protected void Bake()
    {
        Console.WriteLine("焼く");
    }

    protected abstract void End();
}

具象クラス

// マルゲリータ
class Margherita : Pizza
{
    protected override void Start()
    {
        Console.WriteLine("マルゲリータを作ります");
    }

    protected override void Spread()
    {
        Console.WriteLine("トマトソースをぬる");
    }

    protected override void Topping()
    {
        Console.WriteLine("バジル, モッツァレラチーズをのせる");
    }

    protected override void End()
    {
        Console.WriteLine("マルゲリータの完成");
    }
}

// シーフード
class Seafood : Pizza
{
    protected override void Start()
    {
        Console.WriteLine("シーフードピザを作ります");
    }

    protected override void Spread()
    {
        Console.WriteLine("ホワイトソースをぬる");
    }

    protected override void Topping()
    {
        Console.WriteLine("チーズ, 魚介類をのせる");
    }

    protected override void End()
    {
        Console.WriteLine("シーフードピザの完成");
    }
}

プログラムの実行

class Program
{
    static void Main(string[] args)
    {
        Pizza seafoodPizza = new Seafood();
        Pizza margherita = new Margherita();

        seafoodPizza.Make();
        Console.WriteLine("");
        margherita.Make();
    }
}

出力結果

シーフードピザを作ります
生地を伸ばす
ホワイトソースをぬる
チーズ, 魚介類をのせる
焼く
シーフードピザの完成

マルゲリータを作ります
生地を伸ばす
トマトソースをぬる
バジル, モッツァレラチーズをのせる
焼く
マルゲリータの完成

抽象クラスのロジックで処理を共通化できました。

おわり。