設計模式學習-簡單工廠模式

模式概述:

專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類,簡單工廠(Simple Factory)模式又稱爲靜態工廠方法(Static Factory Method)模式,屬於類的創建型模式,但其不屬於23種GOF設計模式之一,通常它根據自變量的不同返回不同的類的實例。


UML類圖:


簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建出哪一個產品類的實例。由上圖可以看出,簡單工廠模式有工廠、抽象產品、具體產品三個角色。

  • 工廠角色(Factory) 
    是簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯。可被外界直接調用來創建產品對象

  • 抽象產品角色(Product)
    是簡單工廠模式所創建的所有產品對象的父類,它負責描述所有實例所共有的公共接口

  • 具體產品角色(ConcreteProductA及ConcreteProductB)
    是簡單工廠模式的創建目標,所有創建的對象都是充當這個角色的某個具體類的實例

應用場景: 

光說不練假把式,下面試着用簡單工廠模式代碼實現一個模擬場景

現實生活中大家都習慣刷卡買單,卡的種類很多,VISA、MASTERCARD等等...下面我們寫代碼模擬刷卡處理


首先,我們先將各種各樣的銀行卡抽象出來,實現一個BankCardHandle抽象類,然後每種卡處理實現一個類,並繼承BankCardHandle

View Code 
    abstract class BankCardHandle 
    {
        public abstract void HandleProcess();
    }

    class VisaHandle : BankCardHandle 
    {
        public override void HandleProcess()
        {
            Console.WriteLine("VISA卡處理中");
        }
    }

    class MasterCardHandle : BankCardHandle 
    {
        public override void HandleProcess()
        {
            Console.WriteLine("MASTERCARD卡處理中");
        }


然後,我們實現工廠角色HandleFactory,定義一個靜態方法生成BankCardHandle的實例

View Code 
    class HandleFactory 
    {
        public static BankCardHandle CreateBankCardHandle(string type) 
        {
            switch (type.ToUpper())
            {
                case "VISA":
                    return new VisaHandle();
                case "MASTERCARD":
                    return new MasterCardHandle();
                default:
                    return null;
            }
        }


到這裏,三個角色全部定義完成,下面看看客戶端調用的代碼實現

View Code 
        BankCardHandle hd;
        hd = HandleFactory.CreateBankCardHandle("VISA");
        hd.HandleProcess();
        hd = HandleFactory.CreateBankCardHandle("MASTERCARD");
        hd.HandleProcess();

到此我們模擬的刷卡實現就完成了。


優勢劣勢:

  在簡單工廠模式中,工廠類是整個模式的關鍵,其包含必要的判斷邏輯,能夠根據外界給定的信息,決定究竟創建哪個類的實例,外界可以不用去關注對象的創建,僅需要負責“消費”對象就可以了,明確區分了責任,有利於結構的優化。

  不過,簡單工廠模式的缺點也提現在其工廠類上,該類集中了所有實例的創建邏輯,違反了高內聚的責任分配原則,當系統的具體產品類不斷增多時,工廠類中條件判斷過多,不利於擴展及維護,簡單工廠模式的這些缺點,利用工廠方法模式可以得到一定的克服。

  未完待續.... 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章