1. 程式人生 > 實用技巧 >C#設計模式(2)——工廠模式

C#設計模式(2)——工廠模式

C#設計模式(2)——工廠模式

1.工廠模式介紹

上一篇我們知道了簡單工廠的缺點是:當我們新增一個新的產品時需要修改工廠類,這樣就違背了開閉原則
工廠模式就是為了解決這一缺陷而出現的,
解決的方法是把建立具體例項的任務放在了工廠的子類中
工廠只提供了建立例項的的介面
還以上一篇中的生產滑鼠為例:

滑鼠類:

//滑鼠抽象類
    public abstract class Mouse
    {
        public abstract void Print();
    }
   //戴爾滑鼠
    public class DellMouse : Mouse
    {
        public
override void Print() { Console.WriteLine("生產了一個Dell滑鼠!"); } } //惠普滑鼠 public class HpMouse : Mouse { public override void Print() { Console.WriteLine("生產了一個惠普滑鼠!"); } }

工廠類只提供生產滑鼠的抽象方法(或者介面),其子類生產具體的產品,
如戴爾滑鼠工廠繼承於滑鼠工廠,它只生產戴爾滑鼠;惠普滑鼠工廠只生產惠普滑鼠,程式碼如下:

    //這裡也就是說,首先建立一個抽象的工廠類(裡面設定了方法),然後每個例項也都建立工廠繼承抽象工廠
///
<summary> /// 滑鼠工廠抽象類 /// </summary> public abstract class MouseFactory { public abstract Mouse CreateMouse(); } //戴爾滑鼠工廠 public class DellMouseFactroy : MouseFactory { public override Mouse CreateMouse() {
return new DellMouse();//在具體的工廠中例項化產品 } } //惠普滑鼠工廠 public class HpMouseFactory : MouseFactory { public override Mouse CreateMouse() { return new HpMouse();//在具體的工廠中例項化產品 } }

客戶端程式碼:

static void Main(string[] args)
        {
            //生產一個戴爾滑鼠
            MouseFactory dellMouseFactory = new DellMouseFactroy();//先要獲取這個產品對應的具體工廠例項
            Mouse dellMouse= dellMouseFactory.CreateMouse();//再通過具體工廠來例項化產品
            dellMouse.Print();

            //生產一個惠普滑鼠
            MouseFactory hpMouseFactory = new HpMouseFactory();
            Mouse hpMouse = hpMouseFactory.CreateMouse();
            hpMouse.Print();
            Console.ReadKey();
        }

在上邊的例子我們可以看出:客戶端要生產一個具體產品時,
先要獲取這個產品對應的具體工廠例項,然後通過具體工廠來例項化產品
如果我們想生產華碩滑鼠的話,
要新增一個華碩滑鼠工廠類(AsusMouseFactory)和華碩滑鼠類(AsusMouse),
然後在客戶端通過以下程式碼來生產華碩滑鼠:

MouseFactory asusMouseFactroy=new AsusMouseFactroy();
asusMouseFactory.CreateMouse();

通過工廠模式新增新產品是只有新增的操作,而不去修改以前的程式碼,符合開閉原則

只要不修改之前的程式碼就是符合開閉原則

工廠模式的優點:
  工廠模式有效地解決了新增新產品必須要修改工廠類程式碼的問題,符合設計原則中的開閉原則。

工廠模式的缺點:
  工廠模式的本質是將具體例項的建立工作放在了具體子類工廠中進行,
這造成一個新的問題:將選擇例項型別的任務交給了客戶端,
  如我們想生產一個戴爾滑鼠,就必須在客戶端new一個戴爾滑鼠工廠。
  想象下如果我們new了100個戴爾滑鼠工廠,這是要換到惠普滑鼠怎麼辦?
  只能把new DellMouseFactory一個一個地替換成new HpMouseFactory。
  所以簡單工廠和工廠模式都不是完美的,我們應該根據具體的情況來選擇。