1. 程式人生 > >C#設計模式(3)——抽象工廠模式

C#設計模式(3)——抽象工廠模式

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("生產了一個惠普滑鼠!
"); } } //鍵盤抽象類 public abstract class Keybo { public abstract void Print(); } //戴爾鍵盤類 public class DellKeybo : Keybo { public override void Print() { Console.WriteLine("生產了一個戴爾鍵盤!"); } } //惠普鍵盤
public class HpKeybo : Keybo { public override void Print() { Console.WriteLine("生產了一個惠普鍵盤!"); } }

工廠類, 抽象工廠類提供了生產滑鼠和生產鍵盤的抽象方法,戴爾工廠繼承了抽象工廠,實現抽象方法時只建立自己品牌的滑鼠和鍵盤;惠普工廠同理,程式碼如下:

    /// <summary>
    /// Pc產品工廠抽象類
    /// </summary>
    public abstract class PcFactory
    {
        public abstract Mouse CreateMouse();
        public abstract Keybo CreateKeybo();
    }

    //戴爾pc工廠
    public class DellPcFactroy : PcFactory
    {
        public override Keybo CreateKeybo()
        {
            return new DellKeybo();
        }

        public override Mouse CreateMouse()
        {
            return new DellMouse();
        }
    }

    //惠普pc工廠
    public class HpPcFactory : PcFactory
    {
        public override Mouse CreateMouse()
        {
            return new HpMouse();
        }
        public override Keybo CreateKeybo()
        {
            return new HpKeybo();
        }

    }

客戶端程式碼:

   class Program
    {
        static void Main(string[] args)
        {
            //生產一個戴爾滑鼠/鍵盤
            PcFactory dellFactory = new DellPcFactroy();
            Mouse dellMouse= dellFactory.CreateMouse();
            Keybo dellKeybo = dellFactory.CreateKeybo();
            dellMouse.Print();
            dellKeybo.Print();

            //生產一個惠普滑鼠/鍵盤
            PcFactory hpFactory = new HpPcFactory();
            Mouse hpMouse = hpFactory.CreateMouse();
            Keybo hpKeybo = hpFactory.CreateKeybo();
            hpMouse.Print();
            hpKeybo.Print();
            Console.ReadKey();
        }
    }

程式執行結果如下:

我們可以看出抽象工廠和工廠模式的區別在於:抽象工廠可以生產多種產品(兩種:滑鼠和鍵盤),而工廠模式只生產一種產品(鍵盤),抽象工廠主要時解決生產系列產品的問題。思考一下:如果抽象工廠中只有一種產品是什麼情況呢?只有一種產品的抽象工廠其實就是工廠模式,我們可以把工廠模式看作是抽象工廠的一個特例。

2.小結

上邊例子的類圖:

 

 抽象工廠的優點:抽象工廠具有工廠模式的優點,對新增系列產品符合閉合原則(工廠模式的系列產品只有一種)。如要生產華碩的滑鼠和鍵盤,只需要新增一個AsusPcFactory(繼承與PcFactory),AsusMouse(繼承Mouse),AsusKeybo(繼承Keybo),就可以在客戶端通過以下程式碼生產華碩滑鼠和鍵盤:

PcFactory asusPcFactory=new AsusPcFactory();
asusPcFactory.CreateMouse();//生產華碩滑鼠
asusPcFactory.CreaetKeybo();//生產華碩鍵盤

抽象模式的缺點:抽象模式對新增新產品不符合開閉原則。如要生產顯示器,不僅要新增顯示器抽象類和顯示器具體類,還需要修改PcFactory,在抽象工廠中新增一個CreateDisplay抽象方法(或介面),戴爾工廠和惠普工廠也要實現新增的抽象方法(或者介面)。