Abstract Factory 抽象原廠模式(建立型模式)

來源:互聯網
上載者:User
 貼代碼是為了方便以後查閱,沒有想教人的想法,因為這代碼是我看完 Abstract Factory模式後睡了一晚上第二天理解出來的。如果有什麼不對的地方還請指教,拜託了。  

    /*先宏觀的理解下面這句話後再看代碼:
     *
     * 提供一個介面,讓該介面負責建立一系列“相關或者相互依賴的對象”,無需指定它們具體的類。
             ——《設計模式》GoF
     */

    /************ 門,窗的抽象類別 *************/
    public abstract class Door
    {
        public abstract void DoorStyle();//抽象方法,使衍生類別能夠自由實現所需類型的門
    }

    public abstract class Window
    {
        public abstract void WindowStyle();//抽象方法,使衍生類別能夠自由實現所需類型的窗
    }

    /************ 不同類型的門,窗的實作類別 *************/
    public class WoodDoor : Door    //木門
    {
        public override void DoorStyle()
        {
            Console.WriteLine("使用木門");
        }
    }

    public class StoneDoor : Door   //石門
    {
        public override void DoorStyle()
        {
            Console.WriteLine("使用石門");
        }
    }

    public class WoodWindow : Window   //木窗
    {
        public override void WindowStyle()
        {
            Console.WriteLine("使用木窗");
        }
    }

    public class StoneWindow : Window  //石窗
    {
        public override void WindowStyle()
        {
            Console.WriteLine("使用石窗");
        }
    }

    /***************** 建立工廠 ********************/
    //這個工廠裡面都是建立屋子需要的材料,在這個程式中是門和窗
    public abstract class AbstractFactory
    {
        public abstract Door GetDoor(); //抽象方法,使衍生類別能夠自由實現所需類型的門
        public abstract Window GetWindow();//抽象方法,使衍生類別能夠自由實現所需類型的窗
    }

    /******** 建立實現不同類型房屋的工廠 *********/
    public class BadHouseFactory:AbstractFactory  //生產壞屋的工廠
    {
        public override Door GetDoor()
        {
            return new WoodDoor();
        }

        public override Window GetWindow()
        {
            return new WoodWindow();
        }
    }

    public class GoodHouseFactory : AbstractFactory  //生產好屋的工廠
    {
        public override Door GetDoor()
        {
            return new StoneDoor();
        }

        public override Window GetWindow()
        {
            return new StoneWindow();
        }
    }

    /******** Client Application *********/
    public class ClientClass
    {
        //生產房屋所需要的對象(這個程式裡假設只有門和窗)
        private Door door;      //門(沒說明是木門還是石門)
        private Window window; //窗(沒說明是木窗還是石窗)
      
        //是什麼類型的門窗由傳入的哪個工廠來決定
        public ClientClass(AbstractFactory af)
        {
            door = af.GetDoor();
            window = af.GetWindow();
        }
        public void MakeHouse()
        {
            door.DoorStyle();
            window.WindowStyle();
        }
        public static void Main()
        {
            Console.WriteLine("生產劣質房屋:");
            ClientClass t1 = new ClientClass(new BadHouseFactory());
            t1.MakeHouse();
            Console.WriteLine("/n----------------------/n");
            Console.WriteLine("生產優質房屋:");
            ClientClass t2 = new ClientClass(new GoodHouseFactory());
            t2.MakeHouse();
            Console.Read();
        }
    }

 

/* 代碼說明:
 * 這個Demo的背景是一個建築公司,這個建築公司目前可以建築兩種類型的房屋(BadHouse and GoodHouse),在這裡假設建築房子只需要門和窗,
 * 也就是說建築房屋需要的材料現在是恒定不變了,只有門和窗。
 * 那什麼是變化的呢?比如說現在公司升級了,還可以建築一般的混合房屋(NormalHouse)了(木門+石窗 or 石門+木窗),就是說建築的房子的類型是變化的。
 *
 * 建築房子所需要的材料:門,窗。(這個是恒定不變的)
 * 建築房子的類型:BadHouse,GoodHouse,NormalHouse。(這個是變化的)
 *
 * 這時候就可以增加3個類來實現建築NormalHouse了:NormalDoor(繼承自Door),NormalWindow(繼承自Window),NormalHouseFactory(繼承自AbstractFactory),
 * 然後分別實現這3個類,現在建築公司就可以建築3種類型的房子了。
 *
 *
 * OK,再來理解一下這句話:
 * 提供一個介面,讓該介面負責建立一系列“相關或者相互依賴的對象”,無需指定它們具體的類。
             ——《設計模式》GoF

 * 提供一個介面:
 *      在程式中是AbstractFactory類,當然可以把它寫成介面,在這裡我寫成了類。
 *
 * 讓該介面負責建立一系列“相關或者相互依賴的對象”:
 *      建築房子需要什嗎?需要門和窗,門和窗就是依賴的的對象。不可能建築一個房子只需要門而不需要窗。
 *
 * 無需指定它們具體的類:
 *      具體的類在這裡指的是:WoodDoor,StoneDoor,WoodWindow和StoneWindow。在建築房子的時候當然不需要指定這些具體的類了。
 *      為什嗎?因為有BadHouseFactory和GoodHouseFactory這兩個工廠幫我們去和它們打交道了。
 *
 * 注意:門和窗是建築房屋的恒定材料,如何改天建築房子需要門,窗,磚了,過段時間又需要門,窗,磚,水泥了。如果是這樣就不適合用
 * Abstract Factory模式了。
 *
*/ 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.