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


出處:https://www.cnblogs.com/wyy1234/

 

閱讀目錄

 


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抽象方法(或接口),戴爾工廠和惠普工廠也要實現新增的抽象方法(或者接口)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM