シンプルファクトリーデザインパターン

2022年10月5日

ファクトリー設計パターンの実現テストします

シナリオ

ピザショップの例で勉強しましょう

ニューヨークとシカゴに支店を持つピザチェーン店の運用アプリを作ろうと思います
ピザが数種類とトッピングが数種類あります

支店種類
ニューヨーク
ニューヨークスタイルチーズピザ
ニューヨークスタイルギリシャピザ
ニューヨークスタイルペッパーピザ
シカゴ
シカゴスタイルチーズピザ
シカゴスタイルギリシャピザ
シカゴスタイルペッパーピザ

クラス図

店舗マネージャコード

namespace P112Factory
{
    public class StoreSystemManager
    {
        private static void Main(string[] args)
        {
            PizzaStore nyStore = new NYPizzaStore();
            Pizza? pizza = nyStore.OrderPizza("チーズ");
            Console.WriteLine($"イーサンの注文は、{pizza?.Name}");

            Console.WriteLine();

            PizzaStore chikagoStore = new ChicogoPizzaStore();
            pizza = chikagoStore.OrderPizza("チーズ");
            Console.WriteLine($"ジョエルの注文は、{pizza?.Name}");
        }
    }
}

説明

支店を作ります

PizzaStore nyStore = new NYPizzaStore();

支店でピザを注文します

Pizza? pizza = nyStore.OrderPizza("チーズ");

注文したピザ名を表示します

Console.WriteLine($"イーサンの注文は、{pizza?.Name}");

支店ごとのコード

namespace P112Factory
{
    internal class NYPizzaStore : PizzaStore
    {
        protected override Pizza? CreatePizza(string type)
        {
            if (type == "チーズ")
            {
                return new NYStyleCheesePizza();
            }

            if (type == "ギリシャ")
            {
                return new NYStyleGreekPizza();
            }

            if (type == "ペパロニ")
            {
                return new NYStylePepperoniPizza();
            }

            return null;
        }
    }
}

説明

CreatePizzaメソッドは、ピザを作るためのメソッドになります
作るピザの種類を引数で渡します
戻り値は作ったピザのインスタンスです

protected override Pizza? CreatePizza(string type)

引数によって作るピザを選択して実際のインスタンスを返します

if (type == "チーズ")
{
    return new NYStyleCheesePizza();
}

支店ごとのピザコード

コンストラクタに支店ごとの個別ピザの情報を入れておきます
新しくインスタンスが作られた時の値になります
ピザ基本クラスの派生クラスにあたります

namespace P112Factory
{
    internal class NYStyleCheesePizza : Pizza
    {
        public NYStyleCheesePizza()
        {
            Name = "ニューヨークスタイルのソース&チーズピザ";
            Dough = "薄いクラスト";
            Sauce = "マリナラ";
            Toppings.Add("すりおろしたレッジャーのチーズ");
        }
    }
}

ピザの基本クラスコード

abstract class Pizza
{
    public string? Name { get; set; }
    public string? Dough { get; set; }
    public string? Sauce { get; set; }
    public List<string> Toppings { get; set; } = new List<string>();

    public void Prepare()
    {
        Console.WriteLine($"{Name}を下準備");
        Console.WriteLine($"{Dough} 生地をこねる");
        Console.WriteLine($"{Sauce} ソースを追加");
        Console.WriteLine("トッピングを追加");

        foreach (var topping in Toppings)
        {
            Console.WriteLine($" {topping}");
        }
    }

    public void Bake()
    {
        Console.WriteLine("180度で25 分焼く");
    }

    public virtual void Cut()
    {
        Console.WriteLine("ピザを扇型にカットする");
    }

    public void Box()
    {
        Console.WriteLine("PizaaStoreの箱にピザを入れる");
    }
}

説明

ピザごとのトッピングをリストしておくプロパティになります

public List<string> Toppings { get; set; } = new List<string>();

Prepare(作る)作業のの詳細を記したメソッドになります

public void Prepare()

結果

ニューヨークスタイルのソース&チーズピザを下準備
薄いクラスト 生地をこねる
マリナラ ソースを追加
トッピングを追加
すりおろしたレッジャーのチーズ
180度で25 分焼く
ピザを扇型にカットする
PizaaStoreの箱にピザを入れる
イーサンの注文は、ニューヨークスタイルのソース&チーズピザ

シカゴスタイルのディッシュチーズピザを下準備
極厚クラスト 生地をこねる
プラムトマト ソースを追加
トッピングを追加
シュレッドモッツァレラチーズ
180度で25 分焼く
ピザを四角形にカットする
PizaaStoreの箱にピザを入れる
ジョエルの注文は、シカゴスタイルのディッシュチーズピザ

参考