戀愛中的設計模式 之 Simple Factory模式 (簡單工廠模式).doc

戀愛中的設計模式

簡單工廠模式

----Simple Factory Pattern

 

Simple Factory模式的核心特點:

       爲創建對象提供接口,將創建對象的具體過程屏蔽起來。

 

戀愛中的Simple Factory模式:

――追MM麼,少不了請MM吃飯,高檔飯館去不起,KFCMcDonald之類的快餐店自然是上上之選

MM今天我要去KFC吃飯。

――到達KFC

MM我要4個雞翅

GG好的。服務員,給我來4個雞翅

--不幾日,MM又光臨Mcdonald,類似事件再次上演。

 

“案情”分析:

       無論去KFC還是McdonaldMM只要跟你說“來4個雞翅”就行了,不用說“來4KFC的雞翅”或“來4Mcdonald的雞翅”,身爲GG的你自然會根據所處的地點購買到相應的雞翅。

 

       由此不難看出,Simple Factory模式將客戶類(MM)和產品類(雞翅)分隔開來,當客戶類需要某種產品時,只須跟工廠類(苦力GG)請求即可。

 

Simple Factory模式的組成:

       1)        工廠類角色:這是本模式的核心,含有一定的商業邏輯和判斷邏輯。它往往由一個具體類實現。 例子中的GG就屬於工廠類角色

       2)        抽象產品角色:它是實際產品的抽象,提供統一的接口和方法以供實際產品去各自實現。它往往由接口或者抽象類來實現。 例子中並沒有直接出現,不過對KFCMcdonald抽象,可以得到“快餐店”這個接口,它就是抽象產品類

       3)        具體產品角色:工廠類所創建的對象就是此角色的實例。它往往由一個具體類實現。 例子中的KFCMcdonald就是該角色

 

 

Simple Factory模式的優缺點:

優點:從直接創建變成“消費”,讓客戶更“傻瓜”。

       滿足DIP依賴倒轉原則,Dependence Inversion Principle,要針對接口編程,不要針對實現編程,即高層類對底層類開放接口,而不是開放實現)。

       滿足LOD迪米特法則,Law of Demeter,只與你直接的朋友通信,而避免和陌生人通信,MM只跟GG通信,而不去跟快餐店店員通信

消費者無須任何變動就可消費新產品。如:如果你們到了振鼎雞,那麼MM也只要說“4個雞翅”即可,MM不用作任何變動

 

缺點:不滿組OCP(開放-關閉原則,Open-Closed Principle,對擴展開放,對修改關閉)。

當產品發生變動時,工廠類(GG)也要做相應的修改。如:如果增加一個新的產品(比如振鼎雞),工廠類就要作相應的修改;如果MM準備嘗試新產品(比如漢堡),工廠類也需要作相應的修改。

 

Simple Factory模式的使用:

       顧名思義,Simple Factory模式是一種很簡單的模式,它其實是Factory Method模式的一種特殊情況。當用戶需要使用某個對象(吃雞翅),但好幾個類都可以生成這種對象(KFCMcdonald都賣雞翅),用戶不想去考慮該實例化哪個類的時候,就可以考慮使用這種方法。

 

       使用了Simple Factory的一個明顯的好處就是:用戶不需要去實例化對象,只要“消費”對象就可以了。

 

       如何去實現Simple Factory模式呢?可以分以下幾個步驟:

1)  分清角色:客戶,產品,工廠(MM是客戶,GG是工廠,KFCMcdonald是產品);

2)  對產品抽象,創建抽象產品接口(“快餐店”);

3)  實現具體產品(“KFC”類和“Mcdonald”類);

4)  實現工廠類,該類是整個環節的核心,通過工廠類,可以獲得具體產品類的實例,這個函數應該被聲明爲靜態函數

5)  其他操作:客戶類,客戶消費動作等等。

 

例示代碼:

       編程環境:Visual Studio 2005

       運行方法:通過VS05新建C#的Console Application,將下面的代碼全部拷貝,覆蓋Program.cs中的代碼,然後即可運行。

/*

 * 1SIMPLE FACTORY:追MM少不了請吃飯了,麥當勞的雞翅和肯德基的雞翅都是MM愛吃的東西,

 * 雖然口味有所不同,但不管去麥當勞或肯德基,MM只要跟你說“我要個雞翅”就可以了,

 * 如果在KFC,你肯定不會買來MCDONALD的雞翅,反之亦然。

 */

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace Simple_Factory

{

    /// <summary>

    /// 產品接口

    /// </summary>

    interface IFastFood

    {

        void SellChickenWing();

    }

 

    /// <summary>

    /// 實際產品

    /// </summary>

    class KFC : IFastFood

    {

        public void SellChickenWing()

        {

            Console.WriteLine("歡迎光臨KFC!這是您點的個雞翅.請慢慢享用");

        }

    };

 

    /// <summary>

    /// 實際產品

    /// </summary>

    class Mcdonald : IFastFood

    {

        public void SellChickenWing()

        {

            Console.WriteLine("歡迎光臨Mcdonald!這是您點的個雞翅.請慢慢享用");

        }

    };

 

    /// <summary>

    /// 工廠類,苦力...

    /// </summary>

    class SSGG

    {

        public static IFastFood GoTo(string placeName)

        {

            switch(placeName)

            {

                case "KFC" :

                    {

                        return new KFC();

                    }

                case "Mcdonald" :

                    {

                        return new Mcdonald();

                    }

                default :

                    return null;

            }

        }

    };

 

    /// <summary>

    /// 客戶類

    /// </summary>

    class PPMM

    {

        static void Main(string[] args)

        {

            //某天,二人來到KFC吃飯,MM點了個雞翅

            IFastFood targetPlace = SSGG.GoTo("KFC");

            targetPlace.SellChickenWing();

 

            //隔天,二人來到Mcdonald吃飯,MM又點了個雞翅

            IFastFood targetPlace2 = SSGG.GoTo("Mcdonald");

            targetPlace2.SellChickenWing();

        }

    }

}

 

 
發佈了32 篇原創文章 · 獲贊 3 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章