1. 程式人生 > >設計模式 2/23 工廠模式

設計模式 2/23 工廠模式

擴展 eve adb dea 工廠方法 獨立 音頻處理 ret c2c

工廠模式是最常用的設計模式之一,用好了,代碼優雅,可維護性高,對系統設計會上一個臺階

為什麽這麽說,因為工廠模式可以牽扯出抽象工廠模式,也有大家都會聊到的簡單工廠模式

我們要了解一點,23中設計模式中,不包含簡單工廠模式,之所以大家會去聊這個,四個字,漸進明細

通過對簡單工廠模式的了解,我們引入工廠這個詞,不然一個寫代碼的,天天給他講工廠,工廠,工廠,西廠,東廠,會暈

同時,通過逐步的深入,從簡單工廠,到工廠模式,再到抽象工廠,漸進明細的過程,逐步深入的理解,比較優劣,擇優而為我們所用。

試想我們遇到以下情景,我們該怎麽處理

在工作中,我們需要處理不同類型的文件,有音頻的,視頻的,圖片的,文本的。通過程序的處理,我們可以分別提取到不同的信息。

這種情況你準備怎麽處理

工作經驗少的同學默默的心理噗嗤一聲,看我5分鐘搞定

技術分享
 class Program
    {
        static void Main()
        {
            var fileType = "Video";
            switch (fileType)
            {
                case "Video":
                    HandleVideoFile(fileType);
                    break;
                
case "Audio": HandleAudioFile(fileType); break; case "Image": HandleImageFile(fileType); break; case "Text": HandleTextFile(fileType); break
; } Console.ReadKey(); } public static void HandleTextFile(string fileType) { Console.WriteLine("我開始處理文本文件了"); } public static void HandleImageFile(string fileType) { Console.WriteLine("我開始處理圖片文件了"); } public static void HandleAudioFile(string fileType) { Console.WriteLine("我開始處理音頻文件了"); } public static void HandleVideoFile(string fileType) { Console.WriteLine("我開始處理視頻文件了"); } }
View Code

各個方法封裝,獨立,可隨處調用,面向對象三大特性,簡簡單單隨隨便便給你展現一臉

後來,系統變強壯了,業務增加了,要求同時也能處理郵件Email

是不是你這個時候開始修改代碼,增加一個方法,添加一個case,break;

如果後續陸陸續續好幾十種繼續增加,怎麽辦。程序的可維護性,可擴展性在哪裏?

開放-封閉原則在哪裏?

開放-封閉原則是只軟件實體(類,模塊,函數等等),應該可以擴展,但是不可修改

拋開所有原則,再增加5個,你這個類的代碼得有1000行了吧,那麽多case,break, 那天稍微不小心的改錯一個,是不是會引起巨震。

所以,我們開始進行修改,也就是我們接下來進入正題的 簡單工廠模式。

所謂的簡單工廠模式,是將一個具體類的實例化交給一個工廠方法來執行

1個點,敲黑板,重點來了

工廠方法來執行。首先需要一個工廠,還需要一個方法。一個方法來幹嘛?來實例化具體的類,具體的什麽類?具體的算法類!

我們首先來定義一個抽象類

技術分享
    public abstract class Handle
    {
        public abstract void HandleFile();
    }
View Code

這個類告訴全世界,要實現我,就得實現我的方法,我們是強關系,我們是合成關系,我們是擁有關系,我們是鳥兒與翅膀的關系!

而且不準實現我,要實現,先繼承,要繼承,就得override我的所有方法

於是,不得已,要處理的類紛紛開始實現

文件處理類

技術分享
    /// <summary>
    /// 文本處理類
    /// </summary>
    public class TextHandle : Handle
    {
        public override void HandleFile()
        {
            Console.WriteLine("我開始處理文本文件了");
        }
    }
View Code

圖片處理類

技術分享
   /// <summary>
    /// 圖片處理類
   /// </summary>
    public class ImageHandle : Handle
    {
        public override void HandleFile()
        {
            Console.WriteLine("我開始處理圖片文件了");
        }
    }
View Code

視頻處理類

技術分享
    /// <summary>
    /// 視頻處理類
    /// </summary>
    public class VideoHandle : Handle
    {
        public override void HandleFile()
        {
            Console.WriteLine("我開始處理視頻文件了");
        }
    }
View Code

音頻處理類

技術分享
    /// <summary>
    /// 音頻處理類
    /// </summary>
    public class AudioHandle : Handle
    {
        public override void HandleFile()
        {
            Console.WriteLine("我開始處理音頻文件了");
        }
    }
View Code

所有的處理類我們定義好了,如果後續,業務變更,需求增加,再添加什麽郵件啊,電話啊,其他什麽的,我們只需要繼續添加我們的類,而不是通過去添加方法,這樣每個類的單一職責原則是不是體現的很淋漓盡致了,如果單一職責覺得太書面,我們換個稱呼,單一功能原則!沒法再簡單了

所有的處理類已經Ready了,我們的重點工廠可以開始修建了

技術分享
    public class HandleFactory
    {
        public Handle CreateHandle(string fileType)
        {
            Handle handle = null;
            switch (fileType)
            {
                case "Video":
                    handle = new VideoHandle();
                    break;
                case "Audio":
                    handle = new AudioHandle();
                    break;
                case "Image":
                    handle = new ImageHandle();
                    break;
                case "Text":
                    handle = new TextHandle();
                    break;
            }
            return handle;
        }
    }
View Code

不要指指點點,不要指指點點,不要指指點點

我們就像項目過程一樣,漸進明細

這次介紹的是簡單工廠模式,簡單工廠重點是 簡單,工廠

後續增加業務的時候,我們只需要再加case,和對應的Handle類就好了

如何調用呢

技術分享
 class Program
    {
        static void Main()
        {
            var handleFactory = new HandleFactory();
            var fileType = "Text";
            var handle = handleFactory.CreateHandle(fileType);
            handle.HandleFile();
        }

    }
View Code

是不是一下簡單明了,你要是Web程序,可以,要是CS程序,可以,要是WebAPI,也可以

易擴展,可維護

總結下

優點

1、擴展性高,如果想增加一個處理方式,只要擴展一個處理類就可以。

2、屏蔽實現,只關心處理的結果

3、帶你走進工廠模式

缺點

1、每次增加一個處理對象的時候,都需要增加一個處理類,還要同時告訴工廠,增加處理類型

2、增加了系統具體類的依賴

以上就是關於簡單工廠模式的分享

一路前行,風雨無阻,不定時更新

設計模式 2/23 工廠模式