1. 程式人生 > >C#設計模式——簡單工廠模式

C#設計模式——簡單工廠模式

turn static 現在 rri 介紹 return 天都 土豆 增加

一、引言

  這個系列也是自己對設計模式的一些學習筆記,希望對一些初學設計模式的人有所幫助的,在上一個專題中介紹了單例模式,在這個專題中繼續為大家介紹一個比較容易理解的模式——簡單工廠模式。

二、簡單工廠模式的介紹

說到簡單工廠,自然的第一個疑問當然就是什麽是簡單工廠模式了?所有面向對象的編程都是在我們生活中存在的,從詞義的解釋就是我們生活中的工廠就是負責生產產品的,而到開發中對應的就是NEW不同的對象,該模式主要解決的問題就是解決創建對象與該類的解耦。設計原則中經常說的類單一職責、封裝性都有體現。

下面就用現實的中例子來說明該問題,我們大家每天都會去飯店吃飯,每個客戶去飯店吃飯,點的菜都會不一樣,客戶A可能會吃西紅柿燒雞蛋、客戶B可能會吃尖椒炒雞蛋、客戶C可能會吃炒土豆絲,以上場景,我們可能編碼如下:

 public class CustomerA
    {
        /// <summary>
        /// 燒菜方法
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static Food Cook(string type)
        {
            Food food = null;
            // 客戶A說:我想吃西紅柿炒蛋怎麽辦?
            // 客戶B說:我想吃尖椒炒雞蛋怎麽辦?
            // 客戶C說: 炒土豆絲
            if (type.Equals("西紅柿炒蛋"))
            {
                food = new ScrambledEggTomato();
            }
            if (type.Equals("尖椒炒雞蛋"))
            {
                food = new PepperFriedEgg();
            }
            else if (type.Equals("炒土豆絲"))
            {
                food = new FriedPotatoShreds();
            }
            return food;
        }
    }

  

 /// <summary>
    /// 菜的抽象對象
    /// </summary>
    public abstract class Food
    {
        // 輸出點了什麽菜
        public abstract void Print();
    }

    /// <summary>
    /// 炒土豆絲
    /// </summary>
    public class FriedPotatoShreds : Food
    {
        public override void Print()
        {
            Console.WriteLine("炒土豆絲");
        }
    }

    /// <summary>
    /// 尖椒炒雞蛋
    /// </summary>
    public class PepperFriedEgg : Food
    {
        public override void Print()
        {
            Console.WriteLine("尖椒炒雞蛋!");
        }
    }

    /// <summary>
    /// 西紅柿炒雞蛋
    /// </summary>
    public class ScrambledEggTomato : Food
    {
        public override void Print()
        {
            Console.WriteLine("一份西紅柿炒蛋!");
        }
    }


 static void Main(string[] args)
        {
            // 做西紅柿炒蛋
            Food food1 = CustomerA.Cook("西紅柿炒蛋");
            food1.Print();

            Food food2 = CustomerA.Cook("炒土豆絲");
            food2.Print();

            Console.Read();
        }

  從以上代碼可以看出CustomerA類和對應的菜品類耦合度非常高,如果再增加某菜品,還需要修改對應的CustomerA類,如果有多個地方有類似的代碼需要同時修改,造成代碼的重復,我們一直在說代碼的單一職責,CustomerA類本身是客戶點菜類,現在跟創建不同的菜品耦合起來了,再次簡單工廠模式正式解決了以上問題,代碼如下:

C#設計模式——簡單工廠模式