1. 程式人生 > >C#設計模式02-抽象工廠模式(附原始碼)

C#設計模式02-抽象工廠模式(附原始碼)

        抽象工廠模式是所有工廠模式中最為抽象的模式,是抽象程度最高的模式,也是最難理解的一種工廠模式。

        現在舉一個生活中的案例來說明抽象工廠模式,電視是我們生活中必不可說的電器,但是電視有很多廠家,海爾工廠,海信工廠,美的工廠他們都生產自己的電視(海爾電視,海信電視,美的電視)。再有冰箱,這三個廠家又可以生產自己的冰箱(海爾冰箱,海信冰箱,美的冰箱)。等等......在抽象工廠模式中,海爾電視,海爾冰箱,海爾空調等組成的就是一個產品族

。海爾電視,海信電視,美的電視等都是電視。所以他們可以抽象出一個共同的父類:電視類。在這裡,抽象電視類和它的三個子類就構成了一個產品等級結構,同理抽象冰箱類和它的三個子類構成了另外一個產品等級結構。同時海爾工廠,海信工廠,美的工廠也可以抽象出一個共同的父類:工廠。

        所以在抽象工廠模式中,包含以下四種角色:

        (1)抽象工廠(抽象工廠類):它是所有具體工廠的父類,聲明瞭建立一個產品族的方法,並由其子類去實現。抽象工廠可以宣告成介面。

        (2)具體工廠(海爾工廠,海信工廠,美的工廠):它們實現了抽象工廠中宣告的方法,生產出一個產品族(比如:海爾電視,海爾冰箱,海爾空調等一系列海爾產品)。

        (3)抽象產品:(如抽象電視類)它是所有具體產品的父類。宣告所有具體產品的公共方法。抽象產品宣告成介面。

        (4)具體產品(海爾電視,海信電視,美的電視):它們實現了抽象父類中宣告的方法。也是客戶端最終想要的產品。

         下面來看看抽象工廠的類圖吧:

        總之一點,在抽象工廠模式中,客戶端必須針對介面程式設計,絕對不能針對具體的實現類程式設計。否則無法保證程式的擴充套件性和靈活性。不僅僅抽象工廠,在其他的工廠模式中也都是針對介面(抽象)程式設計!

        接下來來看看具體的實現程式碼吧。

        首先是抽象產品(抽象電視,抽象冰箱)的程式碼:

namespace 抽象工廠模式
{
    interface AbstractTV//所有電視的父類
    {
        void DisPlay();//顯示電視型別
    }
}
namespace 抽象工廠模式
{
    interface AbstractBX//所有冰箱的父類
    {
        void Display();//顯示冰箱型別
    }
}
        接下來是所有的具體產品的程式碼(海爾電視,海信電視,美的電視和海爾冰箱,海信冰箱,美的冰箱)

namespace 抽象工廠模式
{
    class HaiErTV:AbstractTV//海爾電視
    {
        public void DisPlay()
        {
            Console.WriteLine("我是海爾電視!");
        }
    }
}
namespace 抽象工廠模式
{
    class HaiXinTV:AbstractTV//海信電視
    {
        public void DisPlay()
        {
            Console.WriteLine("我是海信電視!");
        }
    }
}
namespace 抽象工廠模式
{
    class MeiDiTV:AbstractTV//美的電視
    {
        public void DisPlay()
        {
            Console.WriteLine("我是美的電視!");
        }
    }
}

namespace 抽象工廠模式
{
    class HaiErBX:AbstractBX//海爾冰箱
    {
        public void Display()
        {
            Console.WriteLine("我是海爾冰箱!");
        }
    }
}
namespace 抽象工廠模式
{
    class HaiXinBX:AbstractBX//海信冰箱
    {
        public void Display()
        {
            Console.WriteLine("我是海信冰箱!");
        }
    }
}
namespace 抽象工廠模式
{
    class MeiDiBX:AbstractBX//美的冰箱
    {
        public void Display()
        {
            Console.WriteLine("我是美的冰箱!");
        }
    }
}
        抽象工廠的程式碼如下:
namespace 抽象工廠模式
{
    interface AbstractFactory//所有工廠的父類
    {
        AbstractBX CreateBX();//建立冰箱
        AbstractTV CreateTV();//穿件電視
    }
}
        最後是具體工廠的(海爾工廠,海信工廠)的程式碼

namespace 抽象工廠模式
{
    class HaiErFactory:AbstractFactory//海爾工廠
    {
        public AbstractBX CreateBX()//建立海爾冰箱
        {
            return new HaiErBX();
        }

        public AbstractTV CreateTV()//建立海爾電視
        {
            return new HaiErTV();
        }
    }
}
namespace 抽象工廠模式
{
    class HaiXinFactory:AbstractFactory//海信工廠
    {
        public AbstractBX CreateBX()//建立海信冰箱
        {
            return new HaiXinBX();
        }

        public AbstractTV CreateTV()//建立海信電視
        {
            return new HaiXinTV();
        }
    }
}
        還有客戶端的程式碼:
namespace 抽象工廠模式
{
    class Program
    {
        static void Main(string[] args)
        {
            AbstractBX bx;
            //從配置檔案中獲取工廠名
            string factoryName = ConfigurationManager.AppSettings["factory"];
            //通過反射動態載入程式集,建立工廠例項
            AbstractFactory factory = (AbstractFactory)Assembly.Load("抽象工廠模式").CreateInstance(factoryName);
            bx = factory.CreateBX();
            bx.Display();
            Console.ReadLine();
        }
    }
}
        配置檔案的程式碼如下:
  <appSettings>
    <add key="factory" value="抽象工廠模式.MeiDiFactory"/>
  </appSettings>
        程式的執行結果如下:


        到這裡抽象工廠模式就給大家介紹完了。最後再簡單介紹一下抽象工廠的優缺點:

        優點:抽象工廠在增加產品族的時候,很多好的符合了開閉原則。因為只需要增加具體產品和一個物件的具體工廠即可。不需要修改原始碼。可以提供一個視覺化介面,允許使用者修改配置檔案來修改工廠。

        缺點:如果要增加一個產品等級結構,就需要修改幾乎所有的程式碼。在上面的程式碼中說到了電視,冰箱。如果現在要增加一個抽象空調——海爾空調,海信空調,美的 空調。就需要在抽象工廠中新增建立空調的方法,在所有的具體工廠中實現該方法,如果你係統中工廠類過多,顯然會給修改帶來很大的麻煩。這嚴重違背了開閉原則。也是抽象工廠最大的缺點所在。所以抽象工廠的使用一定要謹慎。以免給後期維護帶來諸多麻煩。

        原始碼下載地址:連結:http://pan.baidu.com/s/1hrw7M2w 密碼:wps7

        下一節將給大家介紹建造者模式