簡單理解C#中的抽象工廠模式是什麼概念!

  抽象工廠模式向客戶端提供一個接口,使得客戶端在沒必要指定具體類型的狀況下,建立多個產品族中的對象。本文采起的仍然是接着之前的那個快餐店的例子。如今,快餐店常常良好,逐漸發展壯大,爲了適合不一樣地方人的飲食習慣,建立了兩大系列(至關於產品族)快餐,北方系列和南方系列。每一個系列分別由一個大廚掌勺。抽象工廠模式對新的產品族支持開閉原則,但對新的產品不支持開閉原則。例如增長新的產品族,如增長美國系列快餐(至關於增長了一個產品族),則只要從每一個產品接口繼承一個相應美國系列產品便可,不須要更改已有的代碼。但若是增長新產品,好比增長了「饅頭」這個產品,則它是不支持開閉原則的,由於你要在廚師接口中,增長返回「饅頭」的方法,這就要修改已存在的接口,而修改了上層接口,繼承此接口的具體類也要隨之改變。編程

使用抽象工廠模式的條件:
1 一個系統不該依賴於產品如何被建立,組合和表達的細節。
2 有多個產品族,而系統只消費其中一個族中的產品
3 同屬於一個產品族的產品是在一塊兒使用的。
4 系統提供一個產品的庫,全部產品都是以一樣的接口實現。spa

看下面的C#實現:code

    /// <summary> 
    /// 抽象工廠模式示例 
    /// </summary> 
    class AbstractFactory
    {
        //定義廚師的抽象工廠 
        public interface Chef
        {
            //這裏定義廚師的公共操做 
            //返回抽象麪條 
            Noodle MakeNoodle();
            //返回抽象米飯
            Rice MakeRice();
            //返回抽象麪包 
            Bread MakeBread();
        }

        //定義北方廚師,實現廚師接口 
        class NorthChef : Chef
        {
            public Noodle MakeNoodle()
            {
                Console.WriteLine("\n製做北方面條...");
                Noodle noodle = new NorthNoodle();
                return noodle;
            }
            public Rice MakeRice()
            {
                Console.WriteLine("\n製做北方米飯...");
                Rice rice = new NorthRice();
                return rice;
            }
            public Bread MakeBread()
            {
                Console.WriteLine("\n正在製做北方面包..");
                Bread bread = new NorthBread(); return bread;
            }
        }
        //定義南方廚師,實現廚師接口 
        class SouthChef : Chef
        {
            public Noodle MakeNoodle()
            {
                Console.WriteLine("\n正在製做南方面條。。。");
                Noodle noodle = new SouthNoodle();
                return noodle;
            }
            public Rice MakeRice()
            {
                Console.WriteLine("\n正在製做南方米飯。。。");
                Rice rice = new SouthRice();
                return rice;
            }
            public Bread MakeBread()
            {
                Console.WriteLine("\n正在製做南方面包。。。");
                Bread bread = new SouthBread();
                return bread;
            }
        }

        //定義麪條產品 
        public interface Noodle
        {
            //這裏定義麪條的公共操做 
        }
        class NorthNoodle : Noodle
        {
            public NorthNoodle()
            {
                Console.WriteLine("\n一碗地道的北方面條產生了");
            }
        }
        class SouthNoodle : Noodle
        {
            public SouthNoodle()
            {
                Console.WriteLine("\n一碗地道的南方面條產生了");
            }
        }
        //定義米飯產品 
        public interface Rice
        {
            //這裏定義米飯的公共操做 
        }
        class NorthRice : Rice
        {
            public NorthRice()
            {
                Console.WriteLine("\n一碗地道的北方米飯產生了,真好吃");
            }
        }
        class SouthRice : Rice
        {
            public SouthRice()
            {
                Console.WriteLine("\n一碗地道的南方米飯產生了,真難吃");
            }
        }
        //定義麪包 
        public interface Bread
        {
            //這裏能夠定義一些麪包的公共操做 
        }
        class NorthBread : Bread
        {
            public NorthBread()
            {
                Console.WriteLine("\n一個地道的北方面包產生了");
            }
        }
        class SouthBread : Bread
        {
            public SouthBread()
            {
                Console.WriteLine("\n一個地道的南方面包產生了");
            }
        }
    }

應用程序的實現:對象

       /// <summary> 
        /// 應用程序的主入口點。 
        /// </summary> 
        [STAThread] 
        static void Main(string[] args) 
        { 
            //針對接口編程,建立對象儘可能返回上層接口,避免使用具體類 
            //下面隱藏了具體的建立各類麪條,米飯和麪包的過程 
            Chef northChef=new NorthChef(); 
            northChef.MakeNoodle(); 
            northChef.MakeRice(); 
            northChef.MakeBread(); 
            Chef southChef=new SouthChef(); 
            southChef.MakeBread(); 
            southChef.MakeNoodle(); 
            southChef.MakeRice(); 
            Console.ReadLine(); 
        } 

其實就這樣!
抽象工廠產生實體工廠,實體工廠生產實體產品,而實體產品又屬於抽象產品!
最終直接面向客戶的是抽象工廠和抽象產品blog

相關文章
相關標籤/搜索