程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> ASP.NET教程:抽象工廠模式

ASP.NET教程:抽象工廠模式

編輯:關於.NET

摘要:介紹了抽象工廠模式的基本概念,並給出了c#語言編寫的程序示例

抽象工廠模式向客戶端提供一個接口,使得客戶端在不必指定具體類型的情況下,創建多個產品族中的對象。本文采取的仍然是接著以前的那個快餐店的例子。

現在,快餐店經常良好,逐漸發展壯大,為了適合不同地方人的飲食習慣,創建了兩大系列(相當於產品族)快餐,北方系列和南方系列。每個系列分別由一個大廚掌勺。

抽象工廠模式對新的產品族支持開閉原則,但對新的產品不支持開閉原則。例如增加新的產品族,如增加美國系列快餐(相當於增加了一個產品族),則只要從每個產品接口繼承一個相應美國系列產品即可,不需要更改已有的代碼。但如果增加新產品,比如增加了“饅頭”這個產品,則它是不支持開閉原則的,因為你要在廚師接口中,增加返回“饅頭”的方法,這就要修改已存在的接口,而修改了上層接口,繼承此接口的具體類也要隨之改變。

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

看下面的C#實現:

namespace ConsoleApplication1
{
    /// <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)
        {
            //針對接口編程,創建對象盡量返回上層接口,避免使用具體類
            //下面隱藏了具體的創建各種面條,米飯和面包的過程
            Console.WriteLine("\n-------------北方廚師-------------------\n");

            Chef northChef=new NorthChef();
            northChef.MakeNoodle();
            northChef.MakeRice();
            northChef.MakeBread();

            Console.WriteLine("\n-------------南方廚師-------------------\n");

            Chef southChef=new SouthChef();
            southChef.MakeNoodle();
            southChef.MakeRice();
            southChef.MakeBread();

            Console.ReadLine();
        }
    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved