C#-シンプルなファクトリデザインパターンの詳細

1.基本的な考え方

ご存知のとおり、C#はオブジェクト指向言語であり、カプセル化、継承、ポリモーフィズムはオブジェクト指向の3つの重要な特性であり、単純なファクトリデザインパターンはこれらの特性を完全に反映できます。このパターンを完全に理解するには、最初に、カプセル化(アクセス修飾子の適用)、継承(基本クラスと派生クラスの概念)、およびポリモーフィズム(オーバーロード、仮想メソッド、オーバーライド、および抽象メソッドの概念)のすべてを理解する必要があります。柔軟に使用できます。

1.単純な工場モデルの定義

単純なファクトリパターンは、ファクトリクラスを作成し、入力パラメータを介してオブジェクトを作成し、基本クラスに値を割り当て、目的の派生クラスへの呼び出しを完了するだけです。これにより、特定の操作が完了します。サブクラスでは、ファクトリクラスはロジックの計算と基本クラスへの値の割り当てのみを担当します。このパターンには3つの部分があります
。1。ファクトリクラス:すべてのインスタンスを作成する選択タイプと、外部から呼び出されるインターフェイスを実装します。
2.抽象クラス:作成されるクラスの基本クラス。クラスのすべてのインスタンスに共通の共通インターフェイス(メソッド)を記述します。これは、抽象クラスまたはインターフェイスタイプ(インターフェイス)の場合があります。この例は抽象クラスです。 。
3.具象クラス:作成されるすべての具象インスタンスオブジェクト。
なぜシンプルなファクトリーモデルを使用するのですか?私の理解によると、その理由は次のとおりです。
通常、直面する必要のあるオブジェクトが多数あるため、多くのクラスが生成され、クラスのオブジェクトをインスタンス化する必要があります。各クラスがにある場合は、考えてみてください。 main関数内でインスタンス化するには、多くのコードを記述する必要があるため、ポリモーフィックメソッドを使用して実現する必要があります。さらに、サブクラスオブジェクトは、ファクトリクラスのメソッドを使用してインスタンス化されます。サブクラスメソッドを呼び出す基本クラス。

2.例

たとえば、夕食に行くときは、特定の食事の準備ができる時間とレシピを知りたいと思います。煮込みチキンライス、河南省の燜面餃子、餃子など、さまざまな種類から選択できます。 、など。答えを得るために食事の名前を「恣意的に」叫びたい場合は、ファクトリーモデルを実装する必要があります。
まず、抽象クラスを作成し、すべての種類の米をまとめて「食品」と呼び、クラス内に1つ以上の抽象メソッドを作成する必要があります。基本クラスが抽象クラスの場合、サブクラスを書き直す必要があることに注意してください。そのため、抽象基本クラスが作成されます。サブクラスメソッドで任意の効果を実現できます。

    public abstract class Food
    {
        public abstract void Ask();
        public abstract void Menu();
    }

次に、各食事に固有のすべてのサブカテゴリを作成します。

public class Rice : Food
    {
        public override void Ask()
        {
            Console.WriteLine("黄焖鸡米饭正在制作中,还需1分钟");
        }
        public override void Menu()
        {
            Console.WriteLine("鸡,米,油,盐,酱油,海带丝,香菇,辣椒");
        }
    }

    public class Noodles: Food
    {
        public override void Ask()
        {
            Console.WriteLine("河南烩面正在制作中,还需1小时");
        }
        public override void Menu()
        {
            Console.WriteLine("面,羊肉汤,葱花,盐");
        }
    }

    public class Dumplings : Food
    {
        public override void Ask()
        {
            Console.WriteLine("饺子正在制作中,还需1天");
        }
        public override void Menu()
        {
            Console.WriteLine("韭菜,鸡蛋,油,盐");
        }
    }

次に、コア部分が来ます。ファクトリクラスを作成するために実装されるメソッドです。形式は次のとおりです。アクセス修飾子+静的キーワード+基本クラス名+メソッド名(パラメーター名)。これにより、サブクラスは基本クラスの機能。

       //简单工厂的核心,根据用户的输入创建对象赋值给父类
       public static class 老高饭庄
        {
            public static Food Cook(string Foodname)
            {
                Food f = null;
                switch (Foodname)
                {
                    case "黄焖鸡米饭":
                        f = new Rice();
                        break;
                    case "河南烩面":
                        f = new Noodles();
                        break;
                    case "韭菜鸡蛋饺子":
                        f = new Dumplings();
                        break;
                    default:
                        break;
                }
                return f;
            }
        }

最後に、ファクトリクラスをインスタンス化するメイン関数では、任意のサブクラスへの呼び出しがファクトリクラスを介して実行できることがわかります。

 static void Main(string[] args)
        {
            Console.WriteLine("请输入菜名:");
            string Foodname = Console.ReadLine();
             Food f = 老高饭庄.Cook(Foodname);
             f.Ask();
             f.Menu();
            Console.ReadKey();
        }

プログラム表示
ここに画像の説明を挿入

3、まとめ

このモードの利点は、サブクラスオブジェクトの呼び出しがパラメーターによってのみ完了でき、拡張が容易なことです。欠点も明らかです。クラスを追加する場合は、ファクトリクラスを変更して完了する必要があり、開始と終了の原則に違反します(ソフトウェアエンティティは拡張のために開いて、変更のために閉じる必要があります)。
これを最初に書いて、後で更新し続けてください。

おすすめ

転載: blog.csdn.net/baidu_35536188/article/details/109575787