1. 程式人生 > >常用的軟體設計模式(二)簡單工廠模式

常用的軟體設計模式(二)簡單工廠模式

剛參加工作的時候,絲毫沒有面向物件的思想,所有分支都使用一堆的if...else...,現在回頭看以前的程式碼,著實low。但是隻要一心想著進步的人,一定是會總結和反省的,為什麼以前的程式碼出現bug這麼難維護,功能擴充套件那麼難,程式碼難得到複用,過了段時間連自己寫的程式碼都不知道什麼意思。都說女孩子邏輯思維比不上男孩子,工作幾年並沒這種感覺,區別在於總結和分析罷了,只要比別人多一點耐心,多一點總結,一年之後就會發現那些和你同一起點的人已經遠遠被你甩在後面,不廢話了,今天大豬蹄:簡單工廠模式,告別眼花繚亂的if...else。

簡單工廠模式:顧名思義,最少有一個生產產品的機器存在的工廠,有了這個工廠,當你需要某一物件時,傳入一個正確的引數,就可以獲取你所需要的物件,而無需知道其建立細節

優點:把分支封裝在工廠類裡,讓工廠類判斷使用者需要什麼物件,然後創建出什麼物件,不用把分支程式碼開發出來,模組清晰化,各個部分各司其職

缺點:依然需要在工廠類的新增分支語句只是把if...else...改成了switch...case...,在新增新的產品時,既需要新增新的產品類,也需要修改工廠類的程式碼,這裡就顯得耦合性較高,不過這個問題也是有辦法解決的,這個留到後面章節再講

寫一個特別簡單的例子,客戶需要根據名字獲取不同型別的水果,如果是剛畢業的我,一定會寫成下面這樣:

        static void Main(string[] args)
        {
            Console.Write("請輸入水果名稱:");
            string fruitName = Console.ReadLine;
                switch (fruitName)
                {
                    case "Apple"://蘋果
                        Console.Write("你要的蘋果\t");
                        break;
                    case "Banana": //香蕉
                        Console.Write("你要的香蕉\t");
                        break;
                    default:
                        Console.Write("這裡沒有你要的水果\t");
                        break;
                }
        }

   簡單工廠模式設計如下,包含以下幾個類,使用者類、工廠類、抽象產品類、具體產品類

//抽象產品類
public class FruitType
{
    public virtual void ShowFruit();
}


//蘋果類
Class Apple:FruitType
{
    public override void ShowFruit()
    {
        Console.Write("你要的蘋果\n\t");
    }
}


//香蕉類
Class Banana:FruitType
{
    public override void ShowFruit()
    {
        Console.Write("你要的香蕉\n\t");
    }
}


//工廠類
public class FruitFactory
{
    public static FruitType CreateFruit(string fruit)
    {
        FruitType fruitType = null;
        switch(fruitType)
        {
            case "apple":
                    fruitType = new Apple();
                    break;
            case "banana":
                    fruitType = new Banana();
                    break;
        }
        return fruitType;
    }
}

//客戶類
Class Client
{
    FruitType fruitType;
    fruitType = FruitFactory.CreateFruit("apple");
    fruitType.ShowFruit();
}